Maison > base de données > tutoriel mysql > Pourquoi les requêtes d'expression de date SQL Server 2008 sont-elles plus lentes que les requêtes littérales de chaîne ?

Pourquoi les requêtes d'expression de date SQL Server 2008 sont-elles plus lentes que les requêtes littérales de chaîne ?

Linda Hamilton
Libérer: 2024-12-30 07:23:13
original
265 Les gens l'ont consulté

Why Are SQL Server 2008 Date Expression Queries Slower Than String Literal Queries?

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)  
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal