İcra planları harika ama bazen size gerçeği söylemiyorlar. İşte performans testine dayanan bir kanıt.
(ve sonuçta - ifade her satır için değerlendirilmiyor)
;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 satır etkilendi)
Bu OP sorgusu ve çalışması yaklaşık 12 saniye sürüyor
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Yürütmeden önce bir parametrede tarihi saklayan bu sorgu yaklaşık 12 saniye sürer.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
Ve sadece sonuçları doğrulamak için -
col1 üzerinde hesaplamayı yapar ve bu nedenle her satır için ifadeyi yeniden hesaplamak zorunda Bu sorgu çalıştırmak için yaklaşık 30 saniye sürer.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Tüm sorgular tekrar tekrar aynı metrikleri göstererek yürütüldü
GETDATE()
.