Próbuję rozwiązać problem blokowania, który występuje przez mniej niż sekundę. Aplikacja OLTP jest bardzo wrażliwa i musi mieć czas odpowiedzi mniejszy niż 200 ms dla niektórych transakcji zgodnie z ustaloną umową SLA. Wystąpiły pewne problemy z eskalacją blokady w nowej wersji kodu, które udało nam się rozwiązać, zmniejszając rozmiar partii w aktualizacjach. Nawet przy małej wielkości partii podejrzewamy, że nowy sp blokuje te same wiersze, które aktualizują transakcje OLTP.
Muszę znaleźć blokowaną sesję i zasób, na który czeka. Zgodnie z moim rozumieniem „próg zablokowanego procesu” można ustawić na co najmniej 1 sekundę, więc nie spowoduje to zablokowania blokady.
Eksperymentuję z wydarzeniami wait_info i wait_completed x.
Czy jest jakiś inny sposób, aby to wyśledzić. Dzięki
Odpowiedzi:
Ponieważ jesteś szczególnie zainteresowany blokowaniem, a nie ogólnym oczekiwaniem,
locks_lock_waits
wydarzenie rozszerzone wydaje się bardziej odpowiednie.Przy włączonym filtrze
increment >= 200
Powyższe gromadzi instrukcje czekające na blokady przez określony czas, ale nie podaje określonego zasobu blokady.
Nigdy nie korzystałem z tego wydarzenia i nie mam wglądu w to, ile narzutu spowodowałoby to na twoim serwerze produkcyjnym.
Znalazłem ten film na ten temat. To zdecydowanie zaleca filtrowanie w
counter
celu zmniejszenia liczby zebranych zdarzeń i zrobiłem to powyżej.Wspomina także o starym, nieudokumentowanym poleceniu
Który (jeśli flaga śledzenia 3605 jest włączona) zrzuca ograniczone informacje, takie jak poniżej, do dziennika błędów SQL Server.
Wspominam o tym mimochodem, ponieważ i tak dłuższe wydarzenia byłyby zdecydowanie lepsze, ponieważ są one udokumentowane i mają znacznie większą moc.
źródło
dbcc lock(StallReportThreshold, 200)
pierwszy i wyświetla informacje po przekroczeniu progu, o ile włączona jest flaga śledzenia 3605. SQL Server nie zbiera tych informacji na wypadek, gdybyś mógł je później uruchomić.Jeśli chcesz zablokować, dostępnych jest kilka rozszerzonych wydarzeń:
Pierwsze dwa zdarzenia mają
duration
kolumnę (w mikrosekundach), którą można filtrować według progów. Mają teżresource_description
akcję, która da ci szczegółowe informacje na temat zaangażowanych zasobów.W
lock_escalation
zdarzeniu jest takżestatement
akcja, którą można dodać, aby zebrać instrukcję T-SQL, która uruchomiła eskalację blokady. Ma równieżescalation_cause
. Oto przykładowa sesja:Podejrzewam, że istnieje prawdopodobnie powód, dla którego nie można ustawić progu raportu zablokowanego procesu na mniej niż sekundę: blokowanie jest w RDBMS całkowicie normalne - silnik bazy danych musi blokować zasoby, aby je chronić. Chociaż nie ma oficjalnej definicji, kiedy blokowanie staje się blokowaniem, blokowanie tykania w czasie poniżej sekundy wydaje mi się normalne.
źródło