Ich habe eine Frage wie diese:
SELECT col1
FROM MyTable
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Dies gibt einen Tooltip zum Ausführungsplan, der dem folgenden ähnelt:
Wird der dateadd
Teil der Suchprädikate für jede Zeile in der Abfrage ausgeführt? Oder berechnet SQL Server den Wert einmal für die gesamte Abfrage?
quelle
GETDATE()
.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)
Dies ist die OP-Abfrage und die Ausführung dauert ca. 12 Sekunden
Diese Abfrage, bei der das Datum vor der Ausführung in einem Parameter gespeichert wird, dauert ungefähr 12 Sekunden.
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.
Alle Abfragen wurden wiederholt ausgeführt und zeigten ungefähr dieselben Metriken
quelle