我需要调整这个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
此存储过程有什么问题?你会如何重写这个存储过程?
答案 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的方式来实现这一目标。