0

この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

このストアド プロシージャの何が問題になっていますか? このストアド プロシージャをどのように書き直しますか?

4

3 に答える 3

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)

于 2011-01-11T18:08:30.247 に答える
0

あなたが提供したものに基づいて、手続きはかなり単純です。パフォーマンスの問題がある場合はDateAndTime、すべてのフィルタリングがそのフィールドにあるため、インデックスがオンになっていることを確認してください。

于 2011-01-11T18:06:47.120 に答える
0

私がそうするかもしれないことを除いて、私には良いように見えます

WHERE DateAndTime between @FromDateTime_Actual AND @ToDateTime_Actual

しかし、私はそれがパフォーマンスに影響を与えるとは思わないでしょう

パフォーマンスを高速化することを検討している場合は、おそらくインデックスを確認することを検討する必要があります。たとえば、DateAndTime が開始するのに適している場合があります。

その後、このようなパフォーマンスのヒントの記事を参照する必要があります。

Quassnoi が指摘したように、BETWEEN< @FromDateTime_Actual を <= @FromDateTime_Actual に変更する包括的です。本当に包括的でなく、そうしたい場合BETWEENは、 @ToDateTime_Actual の設定方法を変更して、これを実現できます。

于 2011-01-11T18:08:15.533 に答える