KB2926217 — POPRAWKA: Problemy z wydajnością występują, gdy wzrasta aktywność blokady bazy danych w SQL Server

Dotyczy
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Express SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard

Domyślnie ten dodatek Service Pack 1 dla programu SQL Server 2014 i dodatek Service Pack 3 dla programu SQL Server 2012 zawierają tę poprawkę i nie trzeba dodawać żadnych flag śledzenia, aby ją włączyć. Aby włączyć poprawkę po zainstalowaniu jednej z aktualizacji zbiorczych wymienionych w sekcji Rozwiązanie, musisz uruchomić program Microsoft SQL Server, dodając flagę śledzenia 1236 do parametrów uruchamiania.

Objawy

Załóżmy, że uruchamiasz wystąpienie programu Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 lub SQL Server 2008 R2 na komputerze zawierającym wiele procesorów. Gdy liczba blokad (typ zasobu = BAZA DANYCH) dla określonej bazy danych przekracza określony próg, występują następujące problemy z wydajnością:

  • Podwyższone wartości występują LOCK_HASH liczbie spinlocków.

    Uwaga: Patrz sekcja "Więcej informacji", aby uzyskać informacje o tym, jak monitorować tę blokadę.

  • Wykonywanie zapytań lub operacji wymagających blokad bazy danych zajmuje dużo czasu. Na przykład mogą wystąpić następujące opóźnienia w wydajności:

    • Loginy do programu SQL Server
    • Zapytania serwera połączonego
    • sp_reset_connection
    • Transakcje

Uwaga Aby zlokalizować listę blokad (typ zasobu = DATABASE) w danej bazie danych, zobacz sekcję "Więcej informacji". Wartość progowa zależy od środowiska.

Rozwiązanie

Informacje o aktualizacji zbiorczej

Ten problem został po raz pierwszy rozwiązany w następującej aktualizacji zbiorczej programu SQL Server.

Aktualizacja skumulowana 13 dla systemu SQL Server 2008 R2 z dodatkiem SP2 /en-us/help/2967540

Aktualizacja skumulowana 17 dla systemu SQL Server 2008 z dodatkiem SP3 /pl-pl/help/2958696

Aktualizacja zbiorcza 1 dla systemu SQL Server 2014 /pl-pl/pomoc/2931693

Aktualizacja skumulowana 9 dla SQL Server 2012 z dodatkiem Service Pack 1 /en-us/help/2931078

Informacje o aktualizacjach zbiorczych dla programu SQL Server

Każda nowa aktualizacja zbiorcza programu SQL Server zawiera wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji skumulowanej. Sprawdź najnowsze aktualizacje zbiorcze dla programu SQL Server:

      

Informacje o poprawkach
 Obsługiwana poprawka jest dostępna w firmie Microsoft. Jednak ta poprawka ma na celu rozwiązanie tylko problemu opisanego w tym artykule. Tę poprawkę należy stosować tylko do systemów, w których występuje ten konkretny problem.

Jeśli poprawka jest dostępna do pobrania, u góry tego artykułu z bazy wiedzy znajduje się sekcja "Dostępne do pobrania poprawki". Jeśli ta sekcja nie zostanie wyświetlona, prześlij zgłoszenie do działu pomocy technicznej i pomocy technicznej firmy Microsoft w celu uzyskania poprawki.

Uwaga Jeśli wystąpią dodatkowe problemy lub wymagane jest rozwiązanie problemu, może być konieczne utworzenie osobnego zgłoszenia serwisowego. Normalne koszty pomocy technicznej będą dotyczyć dodatkowych pytań i problemów, które nie kwalifikują się do objęcia tą poprawką. Aby uzyskać pełną listę numerów telefonów działu obsługi klienta i pomocy technicznej firmy Microsoft lub utworzyć oddzielne żądanie obsługi, odwiedź następującą witrynę firmy Microsoft w sieci Web:

/contactus/?ws=support Uwaga: Formularz "Dostępne do pobrania poprawki" zawiera języki, dla których poprawka jest dostępna. Jeśli nie widzisz odpowiedniego języka, oznacza to, że nie ma dla niego dostępnej poprawki.

Stan

Firma Microsoft potwierdziła, że jest to problem dotyczący produktów firmy Microsoft wymienionych w sekcji „Dotyczy”.

Więcej informacji

Gdy aplikacja nawiązuje połączenie z programem SQL Server, najpierw ustanawia kontekst bazy danych. Domyślnie połączenie będzie próbowało uzyskać blokadę DATABASE w trybie SH. Blokada SH-DATABASE zostanie zwolniona po zatrzymaniu połączenia lub zmianie kontekstu bazy danych w okresie istnienia połączenia. Jeśli masz wiele aktywnych połączeń, które używają tego samego kontekstu bazy danych, możesz mieć wiele blokad typu zasobu DATABASE dla tej określonej bazy danych.

Na komputerze, który ma 16 lub więcej procesorów, tylko obiekty tabeli używają schematu blokowania partycji. Blokady bazy danych nie są jednak partycjonowane. Z tego względu im większa liczba blokad bazy danych, tym dłużej trwa uzyskanie przez program SQL Server blokady bazy danych. W większości aplikacji nie występują żadne problemy powodowane przez ten projekt. Ale gdy tylko liczba przekroczy określony próg, uzyskanie blokady wymaga dodatkowej pracy i czasu. Chociaż koszt wynosi tylko mikrosekundy za każdą dodatkową blokadę, całkowity czas może szybko wzrosnąć, ponieważ wiadra z hasztagiem blokady są chronione za pomocą spinlocka. Powoduje to dodatkowe cykle procesora i czeka, aż dodatkowe procesy robocze uzyskają blokadę.

Ta poprawka wprowadza partycjonowanie blokady bazy danych, gdy flaga śledzenia T1236 jest włączona podczas uruchamiania. Partycjonowanie blokady DATABASE pozwala zarządzać głębokością listy blokad na każdej partycji lokalnej. To znacznie optymalizuje ścieżkę dostępu używaną do uzyskania blokady BAZY DANYCH.

Aby monitorować LOCK_HASH spinlocka, możesz użyć poniższego zapytania. USTAWIANIE LICZNIKA NAZW WŁĄCZONEGO
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[kręci] bigint,[spins_per_collision] real,[sleep_time] bigint,[wycofuje się] int)
DECLARE int @counter = 1
PODCZAS GDY @counter< 100
      BEGIN
            INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            WAITFOR DELAY '00:00:05'
            USTAW @counter +=1
      END
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
UPUSZCZANIE TABELI #spinlock_stats Aby uzyskać więcej informacji na temat diagnozowania i rozwiązywania rywalizacji o spinlock na SQL Server, przejdź do następującego dokumentu:

Diagnozowanie i rozwiązywanie rywalizacji Spinlock w programie SQL Server Uwaga Chociaż ten dokument jest przeznaczony dla programu SQL Server 2008 R2, zawarte w nim informacje nadal dotyczą programu SQL Server 2012.

Źródła informacji

Aby uzyskać więcej informacji dotyczących flag śledzenia w programie SQL Server 2012, odwiedź następującą witrynę TechNet w sieci Web:

Informacje o flagach śledzenia w programie SQL Server 2012
Aby uzyskać więcej informacji na temat sposobu znajdowania liczby blokad bazy danych dla użytkownika na bazę danych, użyj następującego zapytania do obliczenia tej wartości:select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' z sys.dm_tran_locks
Grupowanie według Resource_database_id, resource_type, request_mode request_status