Nous avons un processus qui génère un rapport d'inventaire. Côté client, le processus fractionne un nombre configurable de threads de travail pour créer un bloc de données pour le rapport qui correspond à un magasin sur plusieurs (potentiellement des milliers, généralement des dizaines). Chaque thread de travail appelle un service Web qui exécute une procédure stockée.
Le processus de base de données pour le traitement de chaque bloc rassemble un tas de données dans une table #Temporary. À la fin de chaque bloc de traitement, les données sont écrites dans une table permanente dans tempdb. Enfin, à la fin du processus, un thread côté client demande toutes les données de la table tempdb permanente.
Plus il y a d'utilisateurs qui exécutent ce rapport, plus il ralentit. J'ai analysé l'activité dans la base de données. À un moment donné, j'ai vu 35 demandes distinctes toutes bloquées à un moment donné du processus. Tous ces SPID avaient de l'ordre de 50 ms d'attente de type LATCH_EX
sur ressource METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Un SPID a cette ressource, et tous les autres bloquent. Je n'ai rien trouvé sur cette ressource d'attente lors d'une recherche sur le Web.
La table dans tempdb que nous utilisons a une IDENTITY(1,1)
colonne. Ces SPID attendent-ils la colonne IDENTITY? Quelles méthodes pourrions-nous utiliser pour réduire ou éliminer le blocage?
Le serveur fait partie d'un cluster. Le serveur exécute SQL Server 2012 Standard Edition SP1 64 bits sur Windows 2008 R2 Enterprise 64 bits. Le serveur a 64 Go de RAM et 48 processeurs, mais la base de données ne peut en utiliser que 16 car il s'agit de l'édition standard.
(Notez que je ne suis pas ravi de la conception d'utiliser une table permanente dans tempdb pour conserver toutes ces données. Changer cela serait un défi technique et politique intéressant, mais je suis ouvert aux suggestions.)
MISE À JOUR 23/04/2013
Nous avons ouvert un dossier d'assistance avec Microsoft. Je garderai cette question à jour à mesure que nous en apprendrons davantage.
MISE À JOUR 5/10/2013
L'ingénieur de support SQL Server a convenu que les attentes étaient causées par la colonne IDENTITY. La suppression de l'IDENTITÉ a éliminé les attentes. Nous n'avons pas pu dupliquer le problème sur SQL 2008 R2; cela s'est produit uniquement sur SQL 2012.