これはうまくいくかもしれません:
どこで FK.DT =cast(getdate() + 1 - datepart(day, getdate()) as date)
トレース フラグ 4199 をオンにして実行していない限り、バグ カーディナリティの見積もりに影響します。執筆時点で
SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0), DATEADD(m, DATEDIFF(m, 0, getdate()), 0)
返品
<前>+-------------------------+----------------- --------+| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |+-------------------------+------------ --------------+コード>
バグは、カーディナリティの見積もりを導出するときに、質問の述語が 2 番目ではなく最初の日付を使用することです。ということで、以下の設定です。
CREATE TABLE FK(ID INT IDENTITY PRIMARY KEY,DT DATE,Filler CHAR(1000) NULL,UNIQUE (DT,ID))INSERT INTO FK (DT)SELECT TOP (1000000) DATEADD(m, DATEDIFF( m, getdate(), 0), 0)FROM master..spt_values o1, master..spt_values o2UNION ALLSELECT DATEADD(m, DATEDIFF(m, 0, getdate()), 0)
クエリ 1
SELECT COUNT(Filler)FROMWHERE FK.DT =CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)
一致する行の数が 100,000 になると見積もっています。これは日付 '1786-06-01'
に一致する番号です .
ただし、次のクエリは両方とも
SELECT COUNT(Filler)FROM FKWHERE FK.DT =CAST(GETDATE() + 1 - DATEPART(DAY, GETDATE()) AS DATE)SELECT COUNT(Filler)FROM FKWHERE FK.DT =CAST(DATEADD (m, DATEDIFF(m, 0, getdate()), 0) AS DATE) オプション (QUERYTRACEON 4199)
この計画を与える
カーディナリティの推定がより正確になったため、プランはフル スキャンではなく単一のインデックス シークのみを実行するようになりました。