Istnieje wiele powodów, dla których aplikacje mogą wolniej reagować, ale jeśli użytkownicy narzekają na wydajność, możesz mieć do czynienia z zakleszczeniem programu SQL Server. Na szczęście istnieją sposoby identyfikowania i korygowania zakleszczeń w SQL Server, a nawet zapobiegania negatywnemu wpływowi na wydajność aplikacji.
Zakleszczenie programu SQL Server jest zasadniczo dystansem między dwoma procesami, które konkurują o wyłączny dostęp do tego samego zasobu. Ponieważ tylko jeden proces może korzystać z zasobu w danym momencie, wydajność spada do momentu rozwiązania zakleszczenia.
Istnieją dwa rodzaje zakleszczeń w SQL Server, na które należy uważać:blokady konwersji i blokady cykli.
Zakleszczenia blokad konwersji występują, gdy wątek próbuje przekonwertować blokadę z jednego typu wyłącznego na inny typ wyłączny, ale nie może, ponieważ inny wątek ma już wspólną blokadę na zasobie, który pierwszy wątek próbuje przekonwertować.
W SQL Server istnieją trzy rodzaje blokad konwersji:
- Udostępnione z wyłącznością intencji (SIX):Ta blokada występuje, gdy transakcja, która posiada blokadę współdzieloną, ma również blokadę na wyłączność na niektórych stronach lub wierszach.
- Współdzielona z zamierzoną aktualizacją (SIU):ta blokada występuje, gdy transakcja, która posiada wspólną blokadę, ma również niektóre strony lub wiersze zablokowane blokadą aktualizacji.
- Aktualizacja z wyłącznym zamiarem (UIX):Ta blokada występuje, gdy transakcja, która posiada blokadę aktualizacji, ma również blokadę na wyłączność na niektórych stronach lub wierszach.
Blokady cykliczne to zakleszczenia programu SQL Server spowodowane przez dwa procesy rywalizujące o wyłączną blokadę zasobu, który jest zablokowany przez inny proces.
Na przykład, Proces 1 blokuje Zasób 1, czekając, aż Proces 2 zwolni blokadę Zasobu 2. Jeśli Proces 2 blokuje Zasób 2, czekając, aż Proces 1 zwolni Zasób 1, mamy siebie zakleszczenie blokady rowerowej.
Jak zdiagnozować zakleszczenie serwera SQL
Zakleszczenie programu SQL Server to tylko jeden z kilkudziesięciu możliwych powodów, dla których Twoja aplikacja może mieć problemy z wydajnością. Jeśli zapytania, które normalnie działają szybko, nagle spowalniają, możliwe, że masz impas. Ale możliwe jest też, że dzieje się coś innego.
Tak więc, poza zauważeniem zmniejszonej szybkości zapytań, w jaki sposób można na pewno ustalić, czy zakleszczenie jest przyczyną problemów z wydajnością bazy danych?
Najłatwiejszym i najbardziej ostatecznym sposobem zidentyfikowania zakleszczenia jest obecność komunikatu o błędzie 1205:
Transakcja (identyfikator procesu %d) została zablokowana na zasobach %.*ls z innym procesem i została wybrana jako ofiara zakleszczenia. Ponownie uruchom transakcję.
Komunikat o błędzie 1205 dosłownie mówi, że istnieje impas i jak go naprawić. Jednak, jak wskazuje Jeremiah Peschka, jeśli nie usuniesz przyczyny impasu, ponowne przeprowadzenie transakcji prawdopodobnie zakończy się niepowodzeniem.
Inną opcją znajdowania zakleszczeń jest wyciągnięcie wykresu zakleszczeń programu SQL Server z rozszerzonych zdarzeń. Wyodrębnienie zakleszczenia za pomocą zdarzeń rozszerzonych umożliwia przejrzenie kodu XML zakleszczenia, który dostarcza więcej informacji niż graficzna reprezentacja wykresu zakleszczenia.
Zakleszczenie XML jest zorganizowane według listy ofiar, listy procesów i listy zasobów. Każda sekcja zawiera szczegółowe opisy ofiar, procesów i zasobów zaangażowanych w impas, co ułatwia rozwiązywanie problemów.
Jak naprawić zakleszczenie serwera SQL
Jedynym sposobem rozwiązania zakleszczenia programu SQL Server jest zakończenie jednego z procesów i zwolnienie zablokowanego zasobu, aby proces mógł zostać ukończony. Dzieje się to automatycznie, gdy SQL Server wykryje zakleszczenie i zabije jeden z konkurujących procesów (tj. ofiarę).
SQL Server zwykle wybiera losowo połączenie do zabicia, ale możliwe jest ustawienie priorytetów zakleszczenia, aby określić, które połączenie zostanie zabite podczas zakleszczenia. Gdy dwa połączenia mają różne ustawienia priorytetów, SQL Server zabije transakcję o najniższym priorytecie.
Jak zapobiec zakleszczeniu serwera SQL
Zakleszczenie programu SQL Server jest faktem, gdy zarządzasz zajętą bazą danych. Jednak administratorzy baz danych mogą pomóc zmniejszyć występowanie zakleszczeń i zminimalizować ich wpływ na wydajność bazy danych, podejmując kilka środków zapobiegawczych:
- Twórz lepsze indeksy
- Dostosuj priorytety transakcji
- Włącz model Try/Retry
- Zmień tryby izolacji
- Przytrzymaj blokady tak krótko, jak to możliwe
- Dostęp do zasobów za każdym razem w tej samej kolejności
- Nie przesyłaj transakcji, dopóki nie będziesz mieć wszystkich potrzebnych informacji
- Eskalacja blokady limitu
Chociaż nie można całkowicie zapobiec zakleszczeniu SQL Server, można wdrożyć te najlepsze praktyki i aktywnie omijać niektóre z najczęstszych źródeł zakleszczeń, aby zapewnić płynny przepływ transakcji i zoptymalizować wydajność bazy danych.