Database
 sql >> Baza danych >  >> RDS >> Database

Unikanie rozwiązywania problemów z wydajnością Knee-Jerk

Rozwiązywanie problemów z wydajnością to sztuka i nauka. Sztuka pochodzi z doświadczenia (i uczenia się na podstawie doświadczeń innych), a nauka pochodzi ze znanych wytycznych dotyczących tego, co robić w jakich scenariuszach.

A przynajmniej tak lubię myśleć i uczyć.

W rzeczywistości wielu administratorów baz danych i programistów praktykuje coś, co nazywam „rozwiązywaniem problemów z wydajnością z podskokiem”. Dzieje się tak często, gdy problem z wydajnością osiągnął krytyczny etap, na przykład w wyniku przekroczenia limitu czasu zapytań, powolnych procesów lub awarii procesów, niezadowolonych użytkowników, a kierownictwo oczekuje odpowiedzi i szybkiego działania!

„Szarpienie za kolano” pochodzi z wykonania powierzchownej analizy problemu i pochopnego wniosku (tak naprawdę jest to chwytanie się brzytwy), że najbardziej rozpowszechnionym objawem musi być przyczyna i próba rozwiązania tego problemu, bez skutku lub z niewielkim skutkiem. często korzystając z błędnych lub wręcz niepoprawnych porad znalezionych w Internecie. Prowadzi to do dużej frustracji i marnowania czasu, a często prowadzi do zmarnowania pieniędzy, gdy organizacja postanawia spróbować rozwiązać problem ze sprzętem poprzez modernizację serwera i/lub podsystemu we/wy, tylko po to, by stwierdzić, że problem nadal istnieje lub pojawia się ponownie dość szybko.

Analiza statystyk oczekiwania to jeden z obszarów, w których najłatwiej jest odruchowo, a w tym poście opowiem o kilku typowych typach czekania i błędach, które ludzie popełniają wokół nich. W artykule takim jak ten nie ma możliwości zagłębienia się w to, co należy zrobić w każdym przypadku, ale dam ci wystarczająco dużo informacji, aby wskazać ci właściwy kierunek.

LCK_M_XX

Większość ludzi zakłada, że ​​jeśli oczekiwanie na blokowanie jest najbardziej rozpowszechnione, to musi to być jakiś problem z blokowaniem, który jest problemem. Często tak jest, na przykład brak odpowiedniego indeksu nieklastrowego powoduje skanowanie tabeli na poziomach izolacji REPEATABLE_READ lub SERIALIZABLE, które eskaluje do blokady tabeli S. (I jako krótka wskazówka, jeśli nie wydaje Ci się, że kiedykolwiek używasz opcji SERIALIZABLE, robisz to, jeśli korzystasz z transakcji rozproszonych – wszystko jest konwertowane na SERIALIZABLE pod osłonami, co może prowadzić do nieoczekiwanych blokad i zakleszczeń.)

Jednak często zdarza się, że blokowanie jest spowodowane czymś innym. Na domyślnym poziomie izolacji READ_COMMITTED blokady obejmujące zmiany są utrzymywane do momentu zatwierdzenia transakcji i będą blokować odczyty i inne aktualizacje tych samych wierszy. Jeśli cokolwiek uniemożliwia zatwierdzenie transakcji, może to spowodować pojawienie się blokady.

Na przykład, jeśli baza danych jest synchronicznie dublowana, transakcja nie może zatwierdzić i zwolnić blokad, dopóki rekordy dziennika nie zostaną przesłane do serwera lustrzanego i zapisane na dysku dziennika serwera lustrzanego. Jeśli sieć jest mocno przeciążona lub istnieje duża rywalizacja we/wy na serwerze lustrzanym, może to poważnie opóźnić operację dublowania, a zatem spowodować, że zatwierdzenie transakcji będzie trwało znacznie dłużej. Wyglądałoby to na blokowanie, ale główną przyczyną jest rywalizacja o zasoby związane z tworzeniem kopii lustrzanych.

Blokowanie czeka, chyba że przyczyna jest oczywista, patrząc na plan zapytania, zablokuj zasób (np. poziom tabeli wskazujący eskalację blokady lub poziom izolacji, postępuj zgodnie z łańcuchem blokowania (używając skryptu, który przechodzi przez kolumnę blocking_session_id w sys.dm_exec_requests, a następnie spójrz, aby zobaczyć, na co czeka wątek na początku łańcucha blokowania. Wskazuje to na główną przyczynę.

ASYNC_NETWORK_IO

Nazwa tego powoduje wiele zamieszania. Na jakim słowie się skupiasz? SIEĆ. Przyczyna tego typu oczekiwania zwykle nie ma nic wspólnego z siecią. Powinien nazywać się WAITING_FOR_APP_ACK (nowledgment) lub podobnie, ponieważ dokładnie tak się dzieje:SQL Server wysłał pewne dane do klienta i czeka, aż klient potwierdzi, że dane zostały zużyte.

Jednym z moich ulubionych pokazów, które należy wykonać podczas nauczania o statystyce oczekiwania, jest uruchomienie zapytania, które zwraca duży zestaw wyników w Management Studio i obserwowanie, jak serwer czeka na ASYNC_NETWORK_IO. Oczywiście nie jest zaangażowana żadna sieć — po prostu SSMS zajmuje dużo czasu, aby odpowiedzieć na SQL Server. Robi to, co jest znane jako RBAR (Row-By-Agonizing-Row), gdzie tylko jeden wiersz na raz jest pobierany z wyników i przetwarzany, zamiast buforować wszystkie wyniki, a następnie natychmiast odpowiadać na SQL Server i przechodzić do przetwarzania buforowane wiersze.

Jest to główna przyczyna czekania ASYNC_NETWORK_IO – słaby projekt aplikacji. Następnie sprawdziłbym, czy serwer, na którym działa kod aplikacji, ma problem z wydajnością, nawet jeśli sam kod aplikacji jest dobrze zaprojektowany. Czasami jest to sieć, ale z mojego doświadczenia wynika, że ​​jest to rzadkie.

OLEDB

Powszechną reakcją odruchową jest utożsamienie tego typu oczekiwania z serwerami połączonymi. Jednak ten czas oczekiwania stał się bardziej powszechny po wydaniu SQL Server 2005, ponieważ 2005 zawierał mnóstwo nowych DMV, a DMV głównie używa OLE DB pod osłonami. Zanim poszukam problemów z połączonym serwerem, sprawdziłbym, czy narzędzie monitorujące stale uruchamia DMV na serwerze.

Jeśli masz serwery połączone, kontynuuj rozwiązywanie problemów, przechodząc do serwera połączonego i sprawdzając tam statystyki oczekiwania, aby zobaczyć, jaki jest najbardziej rozpowszechniony problem, a następnie kontynuuj tę samą analizę.

Inną rzeczą, która może powodować oczekiwanie OLEDB, jest DBCC CHECKDB (i powiązane polecenia). Używa zestawu wierszy OLE DB do przekazywania informacji między podsystemami procesora zapytań i silnika pamięci masowej.

Inne oczekiwania

Niektóre inne oczekiwania, które powodują odruchy kolanowe, to CXPACKET, PAGEIOLATCH_XX, SOS_SCHEDULER_YIELD i WRITELOG. Omówię je w moim poście w przyszłym miesiącu.

Podsumowanie

Jeśli masz problem z wydajnością, poświęć trochę czasu na zrozumienie danych, na które patrzysz, i przeprowadź dalsze badania, aby zawęzić się do głównej przyczyny problemu. Nie chwytaj się tylko tego, co wydaje się być najlepszymi statystykami oczekiwania i postępuj zgodnie z pierwszą radą, którą napotkasz w Internecie (chyba że pochodzi ona z dobrze znanego i renomowanego źródła), w przeciwnym razie prawdopodobnie nie rozwiążesz swojego problemu, a może nawet pogorszyć sytuację.

Jeśli chodzi o ogólne statystyki oczekiwania, więcej informacji na temat ich używania do rozwiązywania problemów z wydajnością znajdziesz w:

  • Moja seria postów na blogu, zaczynająca się od statystyk Wait lub proszę powiedz mi, gdzie to boli
  • Moja biblioteka typów Wait Types i Latch Classes tutaj
  • Mój kurs szkoleniowy online Pluralsight SQL Server:Rozwiązywanie problemów z wydajnością za pomocą statystyk oczekiwania
  • Doradca wydajności SQL Sentry

Był to pierwszy z serii wpisów, które będę robił w ciągu tego roku, w których będzie mowa o odruchowych (re)akcjach związanych z SQL Server io tym, dlaczego są one niewłaściwe. Miłego rozwiązywania problemów do następnego razu!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Język kontroli danych SQL

  2. 5 typowych błędów, których należy unikać podczas deduplikacji danych

  3. Popraw wydajność UDF dzięki NULL ON NULL INPUT

  4. Postępowanie w przypadku wycieku zasobów GDI

  5. Jak uszeregować wiersze w partycji w SQL?