Ausführungspläne sind großartig, aber manchmal sagen sie einfach nicht die Wahrheit. Hier ist also ein Beweis, der auf einem Leistungstest basiert.
(und das Endergebnis - der Ausdruck wird nicht für jede Zeile ausgewertet)
;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 betroffene Zeile)
Dies ist die OP-Abfrage und die Ausführung dauert ca. 12 Sekunden
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Diese Abfrage, bei der das Datum vor der Ausführung in einem Parameter gespeichert wird, dauert ungefähr 12 Sekunden.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
Und nur um die Ergebnisse zu überprüfen -
Diese Abfrage, die die Berechnung für col1 durchführt und daher den Ausdruck für jede Zeile neu berechnen muss, dauert ungefähr 30 Sekunden.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Alle Abfragen wurden wiederholt ausgeführt und zeigten ungefähr dieselben Metriken
GETDATE()
.