Étonnamment, j'ai trouvé que l'utilisation de GETDATE() inline semble être plus efficace que d'effectuer ce type de calcul préalable.
DECLARE @sd1 DATETIME, @sd2 DATETIME;
SET @sd1 = GETDATE();
SELECT * FROM dbo.table
WHERE datetime_column > DATEADD(MINUTE, -1440, @sd1)
SELECT * FROM dbo.table
WHERE datetime_column > DATEADD(MINUTE, -1440, GETDATE())
SET @sd2 = DATEADD(MINUTE, -1440, @sd1);
SELECT * FROM dbo.table
WHERE datetime_column > @sd2;
Si vous vérifiez les plans sur ceux-ci, la requête moyenne viendra toujours avec le plus bas coût (mais pas toujours le temps écoulé le plus bas). Bien sûr, cela peut dépendre de vos index et données, et vous ne devriez pas faire d'hypothèses basées sur une requête que la même optimisation préemptive fonctionnera sur une autre requête. Mon instinct serait de ne pas effectuer de calculs en ligne, et d'utiliser plutôt la variation @sd2
ci-dessus ... mais j'ai appris que je ne peux pas faire confiance à mon instinct tout le temps et je ne peux pas faire d'hypothèses générales basées sur le comportement que j'éprouve dans des scénarios particuliers.
+1 c'est surprenant. Je l'ai juste regardé et je pense que c'est parce que SQL Server ne fait pas de reniflage de variable donc supposera toujours que '> @ variable' correspondra à 30% des rangées (et les coûts montrés dans le plan sont juste basés sur cette estimation) . Il semble être plus précis pour la version 'DATEADD (MINUTE, -1440, getdate())' au moins au moment où le plan est compilé. –
Un problème potentiel/cas de bord avec requêtes GetDate() 'est qu'il est évalué au moment de la compilation et les sélectivités peuvent changer énormément juste à travers le temps [sans déclencher une recompilation] (http://stackoverflow.com/a/9905880/73226) –