这个存储过程有什么问题?

时间:2011-01-11 17:58:53

标签: sql sql-server database performance query-tuning

我需要调整这个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,
           BetAmount, Profit, 
           DateAndTime
   FROM Gaming.GameResults
   WHERE DateAndTime >= @FromDateTime_Actual
     AND DateAndTime < @ToDateTime_Actual
   ORDER BY DateAndTime ASC;
GO

此存储过程有什么问题?你会如何重写这个存储过程?

3 个答案:

答案 0 :(得分:2)

此存储过程没有任何问题。

通过摆脱变量,你可以使它更具可读性:

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

通过在GameResults (DateAndTime)

上创建索引来提高效率

答案 1 :(得分:0)

根据您提供的内容,proc非常简单。如果您遇到性能问题,请确保您在DateAndTime上有索引,因为您的所有过滤都在该字段上。

答案 2 :(得分:0)

向我展示货物,除非我可能

WHERE DateAndTime between @FromDateTime_Actual AND @ToDateTime_Actual

但我不希望它影响性能

如果您希望提高性能,可以考虑查看索引,例如DateAndTime可能是一个很好的起点。

之后,您需要查看Perforamnce提示文章like this one

正如Quassnoi所指出的那样,BETWEEN是包容性的,其变化&lt; @FromDateTime_Actual to&lt; = @FromDateTime_Actual。如果你真的希望它不具有包容性而你想要BETWEEN,你可以修改你设置@ToDateTime_Actual的方式来实现这一目标。