开发者

What is wrong with this stored procedure?

I need to do tuning on this sp:

alter PROCEDURE Gaming.usp_DB_GetGameResultsByDateTime 
(@FromDateTime AS DATETIME2(7) = null ,
 @ToDateTime AS DATETIME2(7)   = null)
AS
   DECLARE @FromDateTime_Actual AS DATETIME2(7) , 
           @ToDateTime_Actual AS DATETIME2(7); 
   SET @FromDateTime_Actual = ISNULL(@FromDateTime, DATEADD (DAY, -1, SYSDATETIME()));
   SET @ToDateTime_Actual = ISNULL (@ToDateTime , SYSDATETIME ());

   SELECT  Id, GameTypeId, PlayerId,
           BetAmoun开发者_StackOverflowt, Profit, 
           DateAndTime
   FROM Gaming.GameResults
   WHERE DateAndTime >= @FromDateTime_Actual
     AND DateAndTime < @ToDateTime_Actual
   ORDER BY DateAndTime ASC;
GO

What is wrong with this stored procedure? How would you rewrite this stored procedure?


There is nothing wrong with this stored procedure.

You could make it a little bit more readable by getting rid of the variables:

ALTER PROCEDURE
        Gaming.usp_DB_GetGameResultsByDateTime
        (
        @FromDateTime AS DATETIME2(7) = NULL ,
        @ToDateTime AS DATETIME2(7) = NULL
        )
AS
DECLARE
        SELECT  Id, GameTypeId, PlayerId, BetAmount, Profit, DateAndTime
        FROM    Gaming.GameResults
        WHERE   DateAndTime >= ISNULL (@FromDateTime , DATEADD (DAY , -1 , SYSDATETIME ()))
                AND DateAndTime < ISNULL (@ToDateTime , SYSDATETIME ())
        ORDER BY
                DateAndTime ASC
GO

and more efficient by creating an index on GameResults (DateAndTime)


Based on what you provided, the proc is fairly simple. If you have performance issues, make sure you have an index on DateAndTime since all your filtering is on that field.


Looks goods to me except I might do

WHERE DateAndTime between @FromDateTime_Actual AND @ToDateTime_Actual

but I wouldn't expect it to affect performance

If you're looking to make performance faster you should probably consider looking at your indexes for example DateAndTime might be a good place to start.

After that you'll need to look at Perforamnce Tips articles like this one

As Quassnoi noted, BETWEEN is inclusive which changes < @FromDateTime_Actual to <= @FromDateTime_Actual. If you really want it to be not inclusive and you want to you BETWEEN you can modify the how you set @ToDateTime_Actual to make this happen.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜