Mam takie zapytanie:
SELECT col1
FROM MyTable
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Daje to podpowiedź do planu wykonania podobną do tej:
Czy dateadd
część predykatów wyszukiwania jest wykonywana dla każdego wiersza w zapytaniu? Czy też SQL Server oblicza wartość raz dla całego zapytania?
źródło
GETDATE()
.Plany egzekucji są świetne, ale czasem nie mówią prawdy. Oto dowód oparty na teście wydajności.
(i dolny wiersz - wyrażenie nie jest oceniane dla każdego wiersza)
To jest zapytanie OP i jego uruchomienie zajmuje około 12 sekund
To zapytanie, które przechowuje datę w parametrze przed wykonaniem, trwa mniej więcej w tym samym czasie, 12 sekund.
I tylko w celu zweryfikowania wyników -
To zapytanie, które wykonuje obliczenia na col1 i dlatego musi ponownie obliczyć wyrażenie dla każdego wiersza, zajmuje około 30 sekund.
Wszystkie zapytania były wykonywane wielokrotnie, pokazując mniej więcej te same dane
źródło