データが格納されている特定の日付範囲の間のすべてのレコードを見つける最も正確で効率的な方法を調べようとしていますDATETIME2(3)
フォーマット。日付範囲の間でレコードを見つける最も正確な方法
SET STATISTICS IO ON;
DECLARE @StartDate DATE = '5/1/2017',
@EndDate DATE = '5/31/2017',
@PrevDayStartDate DATE,
@NextDayEndDate DATE;
SET @PrevDayStartDate = DATEADD(DAY, -1, @StartDate);
SET @NextDayEndDate = DATEADD(DAY, 1, @EndDate);
SELECT COUNT(*) AS [Using Dates]
FROM dbo.ccis_11001
WHERE ldstat_date >= @StartDate AND ldstat_date <= @EndDate;
SELECT COUNT(*) AS [DATEADD]
FROM dbo.ccis_11001
WHERE ldstat_date > @PrevDayStartDate AND ldstat_date < @NextDayEndDate;
SELECT COUNT(*) AS [Mixture]
FROM dbo.ccis_11001
WHERE ldstat_date >= @StartDate AND ldstat_date < @NextDayEndDate;
SELECT COUNT(*) AS [Cast Date]
FROM dbo.ccis_11001
WHERE CAST(ldstat_date AS DATE) >= @StartDate AND CAST(ldstat_date AS DATE) <= @EndDate;
次は、クエリからの統計です:
Table 'ccis_11001'. Scan count 9, logical reads 152039, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ccis_11001'. Scan count 9, logical reads 153963, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ccis_11001'. Scan count 9, logical reads 153896, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ccis_11001'. Scan count 1, logical reads 125678, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
おそらく、私は完全にこれらの結果を読む方法を理解していないが、私が見つかりました。ここで
は、私がテストしてい4つのクエリがありますWHERE句で2つのCASTSを使用する問合せでは、他の3つの問合せよりスキャンと論理読取りが少なくなります。
しかし、CASTSを使用したクエリの実行には3つ以上のコストがかかります。
しかし、私のポストの理由は、私が引くか、元の日付パラメータに日追加したクエリのカウントは2と一致していないということです:最初の3は同じ正確な計画を有します続くクエリ。私は最初のクエリがDATETIME2(3)
フィールドの秒数を計算しないことに基づいて異なるカウントを返す理由を理解していますが、リストされた2番目のクエリは3番目と4番目のクエリとは異なる結果を返します。
結果:
Using Dates DATEADD Mixture Cast Date
14394305 14482319 14478923 14478923