KB2526959-FIX : problème de performance des applications lorsqu’une requête fait référence aux tables temporaires créées dans une session dans SQL Server 2008 et SQL Server 2008 R2

S’applique à : SQL Server 2008 R2SQL Server 2008

Microsoft distribue les correctifs Microsoft SQL Server 2008 R2 sous la forme d’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 de correctif SQL Server 2008 R2 antérieure.

Symptômes


Prenons l’exemple du scénario suivant :
  • Une application exécute une requête qui fait référence à des tables temporaires dans Microsoft SQL Server 2008 et Microsoft SQL Server 2008 R2. Les tables temporaires sont créées dans une session au lieu d’une procédure stockée.
  • Le plan de requête est mis en cache.
  • De nombreux utilisateurs exécutent la même requête dans un environnement hautement concomitant. Par exemple, de nombreux utilisateurs utilisent une application qui exécute la requête suivante :
    create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
Dans ce scénario, l’application rencontre des problèmes de performances.Remarque Pour plus d’informations sur la façon d’identifier ce problème, voir la section « informations supplémentaires ».

Cause


Ce problème se produit car les mêmes plans de requête sont insérés dans le cache dans le même compartiment de hachage pour chaque utilisateur lorsque le texte de la requête est identique. Lorsqu’un grand nombre de plans est haché dans le même compartiment (également appelé chaîne de hachage), le temps de consultation d’un plan dans le cache augmente considérablement et les problèmes de performance peuvent se produire. Par ailleurs, il est possible que les threads de travail rencontrent une contention de verrouillage SpinLock importante et que d’autres threads soient concernés lorsque ces threads de travail n’exécutent pas le planificateur approprié.

Résolution


Remarque Seule la mise à jour pour SQL Server 2008 R2 est actuellement disponible. Pour SQL Server 2008, voir la section « solution de contournement » pour contourner ce problème.

Informations sur les mises à jour cumulatives

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 dans SQL Server 2008 et SQL Server 2008 R2, déplacez des références de tables temporaires vers des procédures stockées à l’intérieur.

Informations supplémentaires


Pour plus d’informations sur la création et la modification des notions de base des tables, visitez le site Web MSDN suivant :La contention SpinLock peut être identifiée à partir de la vue de gestion dynamique sys.dm_os_spinlock_stats (DMV) dont le taux de conflits est élevé sur le SOS_CACHESTORE SpinLock. Pour identifier ce problème, exécutez une requête qui ressemble à ce qui suit :
select cp.bucketid, count(cp.bucketid) as BucketCount, st.text from sys.dm_exec_cached_plans cp cross apply sys.dm_exec_sql_text(cp.plan_handle) as st group by cp.bucketid, st.text having count(cp.bucketid) >1 order by BucketCount desc
Si les conditions suivantes sont vraies lorsque vous exécutez cette requête, vous pouvez rencontrer les problèmes de performances suivants :
  • Cette requête génère le même texte de requête.
  • Le nombre de la même bucketid est élevé.Remarque Un grand nombre de bucketid est généralement de plus de 1000.
  • Les requêtes font référence aux tables temporaires