Optimisation des requêtes : remédier aux performances lentes des requêtes avec les expressions de date
Lorsque vous travaillez avec SQL Server 2008, il est crucial de comprendre l'impact des expressions de date sur les performances des requêtes. Considérez la requête suivante :
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
Cette requête s'exécute exceptionnellement lentement par rapport à une version plus simple qui utilise une chaîne littérale :
Where FK.DT = '2013-05-01'
Cause du problème de performances
Le ralentissement des performances est dû à un bug dans l'estimateur de cardinalité de SQL Server. Le bug affecte la précision des estimations lors de l'utilisation d'expressions de date complexes. Dans ce cas, l'expression est évaluée au début du mois en cours (« 1786-06-01 »), ce qui fausse l'estimation du nombre de lignes correspondantes.
Solution
Pour résoudre le problème de performances, il est recommandé d'utiliser plutôt l'expression suivante :
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Cette expression calcule le premier jour du mois en cours, fournissant des estimations de cardinalité plus précises et améliorant considérablement les performances des requêtes.
De plus, l'activation de l'indicateur de trace 4199 peut résoudre le bogue et fournir des estimations de cardinalité plus précises pour les expressions de date complexes. Cependant, il est important de noter que cela peut avoir des implications pour d'autres requêtes qui reposent sur une estimation de cardinalité correcte.
Bonnes pratiques
Pour des performances de requête optimales, envisagez d'utiliser des requêtes plus simples. expressions de date ou en utilisant des chaînes littérales lorsque cela est possible. Gardez à l’esprit que les expressions de date complexes peuvent conduire à une cardinalité mal estimée et avoir un impact sur l’optimisation des requêtes.
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!