web-dev-qa-db-ja.com

最適化された日付比較、WHERE句、変換またはdatediff = 0?

私のクエリでは、WHERE句の2つの日付を比較しています

CONVERTを一度使用すると:

CONVERT(day,InsertedOn) = CONVERT(day,GETDATE())

もう1つはDATEDIFFを使用します:

DATEDIFF(day,InsertedOn,GETDATE()) = 0

ここに実行計画があります

CONVERTを使用する最初の場合 enter image description here

DATEDIFFを使用する2番目の場合 enter image description here

InsertedOnのデータ型はdatetimeです。

どちらがより最適化されていますか?

5
Kazi Lakit

代わりに、試してください

WHERE InsertedOn>=CAST(GETDATE() AS date) AND
      InsertedOn<DATEADD(day, 1, CAST(GETDATE() AS date))

この式は sargable で、最適なパフォーマンスを得るために必要なものです。 @Mikaelが示すように、InsertedOnが最初の列であり、クエリで使用される他のすべての列がインデックスに含まれるように、インデックスの1つを設計することをお勧めします。クエリに多数の列がある場合は、テーブルのクラスター化インデックスを使用するのがおそらく最善です。 カバーするインデックス を読んでください。

7

日付を変数として持つ方がいいので、クエリの前に一度だけ取得する必要がありますか?

DECLARE @Today DATE
DECLARE @Tomorrow DATE
SET @Today = GETDATE()
SET @Tomorrow = DATEADD(day,1,GETDATE())

SELECT FROM <Table>
WHERE InsertedOn >= @Today
AND InsertedOn < @Tomorrow
1
Lee Walters