実行計画は素晴らしいですが、時には真実を伝えないこともあります。したがって、ここにパフォーマンステストに基づく証明があります。
(そして一番下の行-式はすべての行に対して評価されていません)
;with t(i) as (select 0 union all select i+1 from t where i < 9)
select getdate()-1 as col1,getdate() as col2,getdate() as col3
into #t
from t t0,t t1,t t2,t t3,t t4,t t5,t t6,t t7
(100000000行が影響を受けました)
これはOPクエリであり、実行に約12秒かかります
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
実行前にパラメータに日付を保存するこのクエリは、ほぼ同じ時間、12秒かかります。
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
そして結果を確認するだけ
です-col1で計算を行うこのクエリは、すべての行の式を再計算する必要があるため、実行に約30秒かかります。
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
すべてのクエリが繰り返し実行され、ほぼ同じメトリックが表示されました
GETDATE()
。