KB2481274-FIX : une requête qui utilise la fonction DATEDIFF risque de s’exécuter lentement dans SQL Server 2005 ou SQL Server 2008 ou SQL Server 2008 R2

S’applique à : SQL Server 2008 R2Microsoft SQL Server 2005SQL Server 2008 Service Pack 2

Microsoft distribue les correctifs Microsoft SQL Server 2005 ou Microsoft SQL Server 2008 ou SQL 2008 R2 comme un fichier téléchargeable. Dans la mesure où les correctifs sont cumulatifs, chaque nouvelle version contient tous les correctifs et les correctifs de sécurité inclus dans la version précédente de Microsoft SQL Server 2005 ou Microsoft SQL Server 2008 ou SQL 2008 R2.

Symptômes


Supposez que vous exécutez une requête sur une instance de Microsoft SQL Server 2005 ou Microsoft SQL Server 2008 ou Microsoft SQL Server 2008 R2 qui répond aux conditions suivantes :
  • La requête contient un opérateur relationnel. Par exemple, l’opérateur inférieur à (<).
  • Il existe une fonction DateDiff dans l’opérande de l’opérateur relationnel.
Dans cette situation, il est possible que SQL Server sélectionne un plan de requête sous-optimal pour exécuter cette requête. Par conséquent, la requête peut être lente.

Cause


Ce problème survient parce que l’optimiseur SQL Server sous-estime le nombre de lignes qui seront renvoyées lors de l’utilisation de la fonction DiffDate .

Résolution


Informations sur les mises à jour cumulatives

SQL Server 2005 Service Pack 3

Le correctif de ce problème a été corrigé pour la première fois dans la mise à jour cumulative 15 pour SQL Server 2005 Service Pack 3. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2507766 Package de mise à jour cumulative 15 pour SQL Server 2005 Service Pack 3
Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans l’ancienne version du correctif SQL Server 2005. Microsoft vous recommande d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
960598 Builds SQL Server 2005 publiées après la sortie de SQL Server 2005 Service Pack 3
Des correctifs Microsoft SQL Server 2005 sont créés pour des service packs SQL Server spécifiques. Vous devez appliquer un correctif SQL Server 2005 Service Pack 3 à une installation de SQL Server 2005 Service Pack 3. Par défaut, tout correctif fourni dans un service pack SQL Server est inclus dans le prochain Service Pack SQL Server.

SQL Server 2005 Service Pack 4

Le correctif de ce problème a été émis pour la première fois dans la mise à jour cumulative 2 pour SQL Server 2005 Service Pack 4. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2489409 Package de mise à jour cumulative 2 pour SQL Server 2005 Service Pack 4
Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans l’ancienne version du correctif SQL Server 2005. Microsoft vous recommande d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2485757 Builds SQL Server 2005 publiées après la sortie de SQL Server 2005 Service Pack 4
Des correctifs Microsoft SQL Server 2005 sont créés pour des service packs SQL Server spécifiques. Vous devez appliquer un correctif SQL Server 2005 Service Pack 4 à une installation de SQL Server 2005 Service Pack 4. Par défaut, tout correctif fourni dans un service pack SQL Server est inclus dans le prochain Service Pack SQL Server.

SQL Server 2008 Service Pack 1

Le correctif de ce problème a été émis pour la première fois dans la mise à jour cumulative 13 pour SQL Server 2008 Service Pack 1. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2497673 Package de mise à jour cumulative 13 pour SQL Server 2008 Service Pack 1
Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans l’ancienne version du correctif SQL Server 2008. Microsoft vous recommande d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
970365 Builds SQL Server 2008 publiées après la sortie de SQL Server 2008 Service Pack 1
Des correctifs Microsoft SQL Server 2008 sont créés pour des service packs SQL Server spécifiques. Vous devez appliquer un correctif SQL Server 2008 Service Pack 1 à une installation de SQL Server 2008 Service Pack 1. Par défaut, tout correctif fourni dans un service pack SQL Server est inclus dans le prochain Service Pack SQL Server.

SQL Server 2008 Service Pack 2

Le correctif de ce problème a été émis pour la première fois dans la mise à jour cumulative 3 pour SQL Server 2008 Service Pack 2. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2498535 Package de mise à jour cumulative 3 pour SQL Server 2008 Service Pack 2
Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans l’ancienne version du correctif SQL Server 2008. Microsoft vous recommande d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2402659 Builds SQL Server 2008 publiées après la sortie de SQL Server 2008 Service Pack 2
Des correctifs Microsoft SQL Server 2008 sont créés pour des service packs SQL Server spécifiques. Vous devez appliquer un correctif SQL Server 2008 Service Pack 2 à une installation de SQL Server 2008 Service Pack 2. Par défaut, tout correctif fourni dans un service pack SQL Server est inclus dans le prochain Service Pack SQL Server.

SQL Server 2008 R2 Service Pack 1

Le correctif de ce problème a été émis pour la première fois dans la mise à jour cumulative 1 pour SQL Server 2008 R2 Service Pack 1. Pour plus d’informations sur la façon d’obtenir ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2544793 Package de mise à jour cumulative 1 pour SQL Server 2008 R2 Service Pack 1
Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans la version précédente du correctif SQL Server 2008 R2. Nous vous recommandons d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2567616 Builds SQL Server 2008 R2 publiées après la sortie de SQL Server 2008 R2 Service Pack 1

SQL Server 2008 R2

Le correctif de ce problème a été émis pour la première fois dans la mise à jour cumulative 7. Pour plus d’informations sur la façon d’obtenir ce package de mise à jour cumulative pour SQL Server 2008 R2, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2507770 Package de mise à jour cumulative 7 pour SQL Server 2008 R2
Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans la version précédente du correctif SQL Server 2008 R2. Nous vous recommandons d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
981356 Builds SQL Server 2008 R2 publiées après la sortie de SQL Server 2008 R2

Statut


Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.

Solution de contournement


Pour contourner ce problème, réécrivez la requête de telle sorte que le plan de requête n’utilise pas la fonction DateDiff dans les prédicats. Par exemple, la commande suivante risque de s’exécuter lentement :
create procedure proc_test @date datetimeasselect COUNT (*) from t where c1 <DATEADD(mm, DATEDIFF(mm,0,dateadd(month, -6,@date)), 0)  
Toutefois, vous pouvez réécrire la requête comme suit pour contourner le problème :
create procedure proc_test2 @date datetimeasdeclare @datestr nvarchar(50), @sqlstr nvarchar(1024)set @datestr = CAST (DATEADD(mm, DATEDIFF(mm,0,dateadd(month, -6,@date)), 0)  as nvarchar(50))set @sqlstr ='select COUNT (*) from t where c1 < ''' + @datestr + ''''exec (@sqlstr) 

Références


Pour plus d’informations sur le modèle de service incrémentiel pour SQL Server, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
935897 Un modèle de maintenance incrémentiel est disponible auprès de l’équipe SQL Server pour obtenir des correctifs pour les problèmes signalés
Pour plus d’informations sur le schéma d’appellation des mises à jour de SQL Server, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
822499 Nouveau schéma d’affectation de noms pour les packages de mise à jour logicielle Microsoft SQL Server
Pour plus d’informations sur la terminologie des mises à jour logicielles, cliquez sur le numéro ci-dessous pour consulter l’article de la base de connaissances Microsoft :
824684 Terminologie standard utilisée pour décrire les mises à jour logicielles Microsoft