J'ai une requête comme celle-ci:
SELECT col1
FROM MyTable
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Cela donne une info-bulle sur le plan d'exécution similaire à ceci:
La dateadd
partie des prédicats de recherche est-elle exécutée pour chaque ligne de la requête? Ou SQL Server calcule-t-il la valeur une fois pour la requête entière?
la source
GETDATE()
.Les plans d'exécution sont excellents mais parfois ils ne vous disent tout simplement pas la vérité. Voici donc une preuve basée sur un test de performance.
(et la ligne du bas - l'expression n'est pas évaluée pour chaque ligne)
Il s'agit de la requête OP et son exécution prend environ 12 secondes
Cette requête qui stocke la date dans un paramètre avant l'exécution, prend environ le même temps, 12 secondes.
Et juste pour vérifier les résultats -
Cette requête qui effectue le calcul sur col1 et doit donc recalculer l'expression pour chaque ligne prend environ 30 secondes pour s'exécuter.
Toutes les requêtes ont été exécutées à plusieurs reprises montrant les mêmes mesures
la source