1

SQL Server 2016 を使用しています。

日付の範囲に対してオプションのリストを生成するストアド プロシージャがあります。わかりやすくするために日数に対する運送オプションがありますが、ここでは詳細には重要ではありません。

ストアド プロシージャの最初のステップでは、追加データを保存するための日付のリストが生成されます。このリストの生成には、残りのコードよりも大幅に時間がかかります。このプロセスは個々に短いですが、呼び出しの数は、この 1 つのコードがシステムに他の何よりも大きな負荷をかけていることを意味します。

それを念頭に置いて、いくつかのオプションの効率をテストしてきました。

反復共通テーブル式:

CREATE FUNCTION [dbo].[udf_DateRange_CTE] (@StartDate DATE,@EndDate DATE)
RETURNS @Return TABLE (Date DATE NOT NULL)
AS
    BEGIN
        WITH    dates(date)
                  AS (SELECT    @StartDate [Date]
                      UNION ALL
                      SELECT    DATEADD(dd, 1, [Date])
                      FROM      dates
                      WHERE     [Date] < @EndDate
                     )
            INSERT  INTO @Return 
            SELECT  date
            FROM    dates
            OPTION  (MAXRECURSION 0)
        RETURN 
    END

while ループ:

CREATE FUNCTION [dbo].[udf_DateRange_While] (@StartDate DATE,@EndDate DATE)
RETURNS @Retun TABLE (Date DATE NOT NULL,PRIMARY KEY (Date))
AS
    BEGIN
        WHILE @StartDate <= @EndDate
            BEGIN
                INSERT  INTO @Retun
                VALUES  (@StartDate)
                SET @StartDate = DATEADD(DAY,1,@StartDate)
            END
        RETURN 
    END

事前入力された日付のテーブルからのルックアップ:

CREATE FUNCTION [dbo].[udf_DateRange_query] (@StartDate DATE,@EndDate DATE)
RETURNS @Return TABLE (Date DATE NOT NULL)
AS
    BEGIN
        INSERT  INTO @Return
        SELECT  Date
        FROM    DateLookup
        WHERE   Date >= @StartDate
                AND Date <= @EndDate
        RETURN 
    END

効率の観点から、1年分の日付を1000回生成するテストを行ったところ、次の結果が得られました。

  • CTE: 10.0 秒
  • 間: 7.7 秒
  • クエリ: 2.6 秒

このことから、クエリは間違いなく高速なオプションですが、作成および維持する必要がある日付の永続的なテーブルが必要です。これは、クエリが「自己完結型」ではなく、指定された日付範囲外の日付を要求できることを意味します。

範囲の日付を生成するより効率的な方法、または上記に適用できる最適化を知っている人はいますか?

どうもありがとう。

4

1 に答える 1