Requêtes d'expression de date : plus rapides avec des littéraux de chaîne
Les requêtes utilisant des expressions de date dans leurs conditions, comme le montre l'exemple suivant, présentent souvent une lenteur performances dans SQL Server 2008 :
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
Cependant, il a été observé que le remplacement de l'expression de date par une chaîne un littéral, tel que « 2013-05-01 », entraîne une exécution des requêtes beaucoup plus rapide. Cet écart a rendu de nombreux développeurs perplexes.
La disparité des performances provient d'un bug interne dans SQL Server 2008 qui affecte la façon dont il estime la cardinalité des résultats lorsque des expressions de date sont utilisées. Lorsqu'on lui présente une expression de date comme celle de la question, SQL Server suppose à tort qu'elle représente une valeur constante correspondant à la première date du mois spécifié. Cela conduit à des estimations de cardinalité inexactes, ce qui entraîne des plans de requête inefficaces.
L'utilisation d'une chaîne littérale pour la valeur de date, en revanche, oblige SQL Server à confronter la valeur réelle au moment de l'exécution et à dériver des estimations de cardinalité plus précises. Cela permet à l'optimiseur de générer des plans de requête plus optimaux, conduisant à une exécution plus rapide.
Pour contourner ce bug, on peut utiliser l'expression alternative suivante :
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Cette expression renvoie une constante valeur de date représentant le premier jour du mois en cours, qui correspond au comportement prévu de la requête. Grâce à cette substitution, l'optimiseur peut estimer avec précision la cardinalité et produire un plan de requête plus efficace, résolvant ainsi les goulots d'étranglement de performances associés aux expressions de date.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!