Abbiamo un processo che genera un rapporto di inventario. Sul lato client, il processo divide un numero configurabile di thread di lavoro per creare una porzione di dati per il report che corrisponde a un archivio su molti (potenzialmente migliaia, in genere dozzine). Ogni thread di lavoro chiama un servizio Web che esegue una procedura memorizzata.
Il processo del database per l'elaborazione di ogni blocco raccoglie un mucchio di dati in una tabella #Temporary. Alla fine di ogni blocco di elaborazione, i dati vengono scritti in una tabella permanente in tempdb. Infine, al termine del processo, un thread sul lato client richiede tutti i dati dalla tabella permanente tempdb.
Più utenti eseguono questo rapporto, più lentamente diventa. Ho analizzato l'attività nel database. Ad un certo punto, ho visto 35 richieste separate tutte bloccate in un punto del processo. Tutti questi SPID avevano nell'ordine di 50 ms attese di tipo LATCH_EX
sulla risorsa METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Uno SPID ha questa risorsa e tutti gli altri stanno bloccando. Non ho trovato nulla su questa risorsa di attesa in una ricerca web.
La tabella in tempdb che stiamo usando ha una IDENTITY(1,1)
colonna. Questi SPID stanno aspettando la colonna IDENTITY? Quali metodi possiamo usare per ridurre o eliminare il blocco?
Il server fa parte di un cluster. Il server esegue SQL Server 2012 Standard Edition SP1 a 64 bit su Windows 2008 R2 Enterprise a 64 bit. Il server ha 64 GB di RAM e 48 processori, ma il database può usare solo 16 perché è l'edizione standard.
(Si noti che non sono elettrizzato dalla progettazione dell'utilizzo di una tabella permanente in tempdb per contenere tutti questi dati. La modifica sarebbe una sfida tecnica e politica interessante, ma sono aperta a suggerimenti.)
AGGIORNAMENTO 23/04/2013
Abbiamo aperto un caso di supporto con Microsoft. Terrò questa domanda aggiornata man mano che impareremo di più.
AGGIORNAMENTO 5/10/2013
L'ingegnere del supporto di SQL Server ha concordato che le attese sono state causate dalla colonna IDENTITY. La rimozione dell'IDENTITÀ ha eliminato le attese. Non è stato possibile duplicare il problema su SQL 2008 R2; si è verificato solo su SQL 2012.