Maison > base de données > tutoriel mysql > Pourquoi ma requête SQL Server 2008 est-elle lente lors de l'utilisation d'expressions DateTime dans la clause WHERE ?

Pourquoi ma requête SQL Server 2008 est-elle lente lors de l'utilisation d'expressions DateTime dans la clause WHERE ?

Barbara Streisand
Libérer: 2024-12-18 17:03:13
original
898 Les gens l'ont consulté

Why is My SQL Server 2008 Query Slow When Using DateTime Expressions in the WHERE Clause?

Écart de performances des requêtes avec l'expression DateTime

Une requête connaissant un ralentissement significatif lors de l'utilisation d'une expression de date dans une clause WHERE par rapport à une valeur littérale de chaîne pose un dilemme en termes de performances de requête. Approfondissons le problème et cherchons une solution.

Cause première

L'écart de performances est dû à un bug dans SQL Server 2008, qui affecte les estimations de cardinalité lors de l'utilisation d'une expression de date dans un Clause OÙ. Le bug entraîne des estimations incorrectes du nombre de lignes correspondantes.

Requête optimisée

Pour contourner ce bug, la requête optimisée suivante est suggérée :

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Copier après la connexion

Cette expression renvoie le début du mois en cours, qui est probablement le critère de sélection souhaité dans ce scénario.

Trace Flag 4199

Alternativement, l'indicateur de trace 4199 peut être activé pour forcer des estimations précises de cardinalité. Avec l'indicateur de trace 4199 activé, la requête suivante produira également le plan souhaité :

Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)  
OPTION (QUERYTRACEON 4199)
Copier après la connexion

Exemple

Par exemple, avec une table appelée FK contenant une colonne appelée DT avec des valeurs représentant le début de chaque mois, les deux requêtes suivantes démontrent l'écart de performances :

-- Slow due to incorrect cardinality estimates
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  

-- Fast due to accurate cardinality estimates with trace flag 4199
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  
OPTION (QUERYTRACEON 4199)
Copier après la connexion

Avec l'indicateur de trace 4199 activé, la deuxième requête sera entraîne un temps d'exécution nettement plus rapide grâce au plan de requête optimisé.

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