Mamy proces, który generuje raport asortymentowy. Po stronie klienta proces dzieli konfigurowalną liczbę wątków roboczych, aby utworzyć fragment danych dla raportu, który odpowiada jednemu z wielu sklepów (potencjalnie tysiące, zwykle dziesiątki). Każdy wątek roboczy wywołuje usługę sieci Web, która wykonuje procedurę przechowywaną.
Proces bazy danych do przetwarzania każdego fragmentu gromadzi wiązkę danych do tabeli #Temporary. Na końcu każdej porcji przetwarzania dane są zapisywane w stałej tabeli w tempdb. Wreszcie na koniec procesu jeden wątek po stronie klienta żąda wszystkich danych ze stałej tabeli tempdb.
Im więcej użytkowników uruchamia ten raport, tym wolniej się robi. Analizowałem aktywność w bazie danych. W pewnym momencie widziałem 35 oddzielnych wniosków zablokowanych w jednym punkcie procesu. Wszystkie te identyfikatory SPID miały czas oczekiwania rzędu 50 ms LATCH_EX
na zasób METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Jeden SPID ma ten zasób, a wszystkie inne blokują. Nie znalazłem nic na temat tego zasobu oczekiwania podczas wyszukiwania w sieci.
Tabela w tempdb, której używamy, ma IDENTITY(1,1)
kolumnę. Czy te identyfikatory SPID czekają na kolumnę TOŻSAMOŚĆ? Jakie metody moglibyśmy zastosować w celu zmniejszenia lub wyeliminowania blokowania?
Serwer jest częścią klastra. Na serwerze działa 64-bitowy program SQL Server 2012 Standard Edition SP1 w 64-bitowym systemie Windows 2008 R2 Enterprise. Serwer ma 64 GB pamięci RAM i 48 procesorów, ale baza danych może używać tylko 16, ponieważ jest to edycja standardowa.
(Pamiętaj, że nie jestem podekscytowany projektem użycia stałej tabeli w tempdb do przechowywania wszystkich tych danych. Zmiana tego byłaby interesującym wyzwaniem technicznym i politycznym, ale jestem otwarta na sugestie).
AKTUALIZACJA 23.03.2013
Otworzyliśmy skrzynkę pomocy technicznej w firmie Microsoft. Będę aktualizować to pytanie, gdy będziemy dowiedzieć się więcej.
AKTUALIZACJA 5/10/2013
Inżynier wsparcia SQL Server zgodził się, że oczekiwania zostały spowodowane przez kolumnę TOŻSAMOŚĆ. Usunięcie TOŻSAMOŚCI wyeliminowało oczekiwania. Nie mogliśmy powielić problemu na SQL 2008 R2; miało to miejsce tylko w SQL 2012.