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 秒
このことから、クエリは間違いなく高速なオプションですが、作成および維持する必要がある日付の永続的なテーブルが必要です。これは、クエリが「自己完結型」ではなく、指定された日付範囲外の日付を要求できることを意味します。
範囲の日付を生成するより効率的な方法、または上記に適用できる最適化を知っている人はいますか?
どうもありがとう。