Wir haben einen Prozess, der einen Inventarbericht generiert. Auf der Clientseite teilt der Prozess eine konfigurierbare Anzahl von Arbeitsthreads auf, um einen Datenblock für den Bericht zu erstellen, der einem von vielen Speichern entspricht (möglicherweise Tausende, normalerweise Dutzende). Jeder Arbeitsthread ruft einen Webdienst auf, der eine gespeicherte Prozedur ausführt.
Der Datenbankprozess zum Verarbeiten jedes Blocks sammelt eine Reihe von Daten in einer # Temporären Tabelle. Am Ende jedes Verarbeitungsblocks werden die Daten in eine permanente Tabelle in tempdb geschrieben. Schließlich fordert ein Thread auf der Clientseite am Ende des Prozesses alle Daten aus der permanenten Tempdb-Tabelle an.
Je mehr Benutzer diesen Bericht ausführen, desto langsamer wird er. Ich habe die Aktivität in der Datenbank analysiert. An einem Punkt sah ich 35 separate Anfragen, die alle an einem Punkt des Prozesses blockiert waren. Alle diese SPIDs hatten in der Größenordnung von 50 ms Wartezeiten vom Typ LATCH_EX
auf Ressource METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Eine SPID verfügt über diese Ressource, und alle anderen blockieren. Ich habe bei einer Websuche nichts über diese Warte-Ressource gefunden.
Die von uns verwendete Tabelle in Tempdb enthält eine IDENTITY(1,1)
Spalte. Warten diese SPIDs auf die Spalte IDENTITY? Mit welchen Methoden können wir die Blockierung reduzieren oder beseitigen?
Der Server ist Teil eines Clusters. Auf dem Server wird 64-Bit SQL Server 2012 Standard Edition SP1 unter 64-Bit Windows 2008 R2 Enterprise ausgeführt. Der Server verfügt über 64 GB RAM und 48 Prozessoren, die Datenbank kann jedoch nur 16 verwenden, da es sich um die Standardversion handelt.
(Beachten Sie, dass ich nicht begeistert bin von der Verwendung einer permanenten Tabelle in tempdb, um all diese Daten zu speichern. Eine Änderung wäre eine interessante technische und politische Herausforderung, aber ich bin offen für Vorschläge.)
UPDATE 23.04.2013
Wir haben einen Support-Fall mit Microsoft eröffnet. Ich werde diese Frage auf dem neuesten Stand halten, sobald wir mehr erfahren.
UPDATE 10.05.2013
Der SQL Server-Supporttechniker stimmte zu, dass die Wartezeiten durch die Spalte IDENTITY verursacht wurden. Durch das Entfernen der IDENTITY wurden die Wartezeiten beseitigt. Das Problem konnte in SQL 2008 R2 nicht dupliziert werden. Es trat nur unter SQL 2012 auf.