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

Wprowadzenie do auto_explain:Jak automatycznie rejestrować wolne plany zapytań Postgres

Czy chcesz wiedzieć, dlaczego zapytanie PostgreSQL jest wolne? W takim razie EXPLAIN ANALYZE to świetny punkt wyjścia. Jednak plany zapytań mogą zależeć od innych działań serwera, ich uruchomienie może zająć trochę czasu i mogą się zmieniać w czasie, więc jeśli chcesz zobaczyć rzeczywiste plany wykonania najwolniejszych zapytań, narzędzie auto_explain jest narzędziem, którego potrzebujesz. W tym poście przyjrzymy się, co robi, jak go skonfigurować i jak używać tych dzienników, aby przyspieszyć zapytania.

Co to jest auto_explain?

auto_explain to rozszerzenie PostgreSQL, które umożliwia rejestrowanie planów zapytań dla zapytań wolniejszych niż (konfigurowalny) próg. Jest to niezwykle przydatne do debugowania powolnych zapytań, zwłaszcza tych, które tylko czasami są problematyczne. Jest to jeden z modułów, dzięki czemu można go łatwo zainstalować i skonfigurować na zwykłym PostgreSQL i jest tak użyteczny, że domyślnie jest włączony w ScaleGrid.

Ogromne podziękowania dla Takahiro Itagaki, głównego autora pierwszej wersji auto_explain (zatwierdzenie, wątek), Deana Rasheeda, którego pierwsza łatka i sugestia była oparta, oraz wielu współtwórcy i recenzenci od tego czasu.

Których parametrów auto_explain mam użyć?

Poniżej omówimy najważniejsze parametry, ale zapoznaj się z poniższą tabelą lub oficjalną dokumentacją, aby uzyskać więcej informacji na temat pełnego zakresu rzeczy, które możesz śledzić.

Najważniejszym parametrem auto_explain jest log_min_duration . Domyślnie jest to ustawione na -1 , co oznacza, że ​​nic nie będzie logowane – więc jeśli chcemy jakieś logi musimy to zmienić! Domyślną jednostką jest ms, więc ustawienie 100 zarejestruje plany zapytań dla wszystkich zapytań, które przekraczają 100 ms. To właśnie wybraliśmy jako domyślne w ScaleGrid, ale można to skonfigurować w Admin -> Config. Jeśli z jakiegoś powodu chcesz rejestrować plan zapytań dla każdego zapytania, możesz ustawić to na 0 – ale uważaj, może to mieć poważne konsekwencje dla wydajności.

Ponieważ zapytania są już wykonywane na serwerze, prawdopodobnie chcesz również włączyć auto_explain.log_analyze . To sprawia, że ​​dane wyjściowe są równoważne uruchomieniu EXPLAIN ANALYZE . Domyślnie oznacza to również, że śledzone są czasy operacji. Wiąże się to z pewnym dodatkowym obciążeniem, które można zminimalizować, wyłączając auto_explain.log_timing (domyślnie włączone z log_analyze ). Oczywiście czasy na operację są bardzo przydatne podczas debugowania wolnych zapytań! Nasze wewnętrzne testy wykazały akceptowalne koszty ogólne, więc jest to domyślnie włączone w ScaleGrid, ale jak zawsze przetestuj obciążenie, aby sprawdzić, czy obciążenie jest akceptowalne w Twoim przypadku. Obecnie dostępne publicznie informacje na ten temat są ograniczone, ale niedawny post zespołu pgMustard pokazał, że przynajmniej przy niewielkim obciążeniu transakcyjnym obciążenie może wynosić zaledwie 2%. Jak zauważyli, można to zmniejszyć za pomocą auto_explain.sample_rate parametr, kosztem śledzenia tylko podzbioru zapytań.

Ostatnim parametrem, który omówimy szczegółowo, jest auto_explain.log_format . Domyślnym wyjściem jest TEKST, który prawdopodobnie najlepiej znasz z używania EXPLAIN .

Oto prosty przykład tego, jak może wyglądać wyjście auto_explain w formacie TEKST:

2021-09-10 15:32:04.606 BST [22770] LOG:  duration: 3184.383 ms  plan:
	Query Text: select * from table1 order by column1;
	Sort  (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1)
	  Sort Key: column1
	  Sort Method: external merge  Disk: 4696kB
	  Buffers: shared hit=837, temp read=587 written=589
	  ->  Seq Scan on table  (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1)
	        Buffers: shared hit=834

Widać tutaj, że otrzymujesz czas trwania zapytania na początku, do którego zwykle przywykłeś na końcu planów zapytań. Zobaczysz również tekst zapytania, w tym wszelkie parametry.

Popularne narzędzia do wizualizacji explain.depesz i explain.dalibo, akceptują plany zapytań w formacie TEKSTOWYM, ale oba obsługują również format JSON. Jeśli niektórzy z Twojego zespołu wolą używać narzędzi, takich jak PEV i pgMustard, które obsługują tylko format JSON, możesz ustawić go jako format. W przypadku klientów korzystających ze ScaleGrid zdecydowaliśmy się na format JSON, częściowo dlatego, że chcieliśmy go łatwiej przeanalizować dla naszej własnej funkcji powolnej analizy zapytań.

Oto pełna lista parametrów auto_explain i ich wartości domyślnych:

Parametr Domyślne ustawienia PostgreSQL Domyślne ustawienia ScaleGrid
auto_explain.log_min_duration -1 100
auto_explain.log_analyze Wyłączone Włączone
auto_explain.log_timing Włączone (z log_analyze) Włączone
auto_explain.log_buffers Wyłączone Włączone
auto_explain.log_verbose Wyłączone Włączone
auto_explain.log_triggers Wyłączone Wyłączone
auto_explain.log_nested_statements Wyłączone Wyłączone
auto_explain.log_settings (v12) Wyłączone Wyłączone
auto_explain.log_wal (v13) Wyłączone Wyłączone
auto_explain.log_format TEKST JSON
auto_explain.log_level LOG LOG
auto_explain.sample_rate 1 1

Instalowanie auto_explain

W ScaleGrid auto_explain jest domyślnie włączone z progiem 100 ms. Możesz to skonfigurować w Administracja -> Konfiguracja.

W waniliowym PostgreSQL możesz zainstalować auto_explain po prostu dodając go do jednej z session_preload_libraries lub shared_preload_libraries . Pierwszy z nich ma zalety a) nie wymaga restartu (ale będzie ładowany tylko w nowych sesjach) oraz b) umożliwia włączenie go tylko dla niektórych użytkowników (poprzez ustawienie tego parametru za pomocą ALTER ROLE SET ).

W związku z tym podstawowa konfiguracja auto_explain może wyglądać tak:

session_preload_libraries = auto_explain
auto_explain.log_min_duration = 100
auto_explain.log_analyze = true
auto_explain.log_buffers = true
auto_explain.log_format = JSON

Jeśli korzystasz z innego dostawcy hostingu, warto sprawdzić, czy obsługuje on auto_explain. Na przykład RDS Postgres, ale w przeciwieństwie do ScaleGrid jest domyślnie wyłączony, więc musisz edytować konfigurację, aby uruchomić.

Ładowanie auto_explain w jednej sesji

Jeśli nie chcesz, aby auto_explain było uruchamiane automatycznie w sesjach, jako superużytkownik masz również możliwość załadowania go do pojedynczej sesji:

LOAD 'auto_explain';

Może to być niezwykle przydatne w przypadku jednorazowych sesji debugowania, ale oczywiście jest niepotrzebne, jeśli możesz już je uruchomić.

auto_explain ograniczenia i problemy

Wspomnieliśmy już o niektórych z nich mimochodem, ale wydaje się, że jest to rozsądny moment, aby przypomnieć sobie o niektórych wadach i ograniczeniach funkcji auto_explain.

Po pierwsze, szczególnie podczas śledzenia czasu operacji, użycie auto_explain może wiązać się z wymiernym obciążeniem. Może być niski, nawet przy pomiarach czasów, ale jak zwykle warto przeprowadzić własne testy.

Po drugie, czasy auto_explain nie uwzględniają czasu planowania zapytań. Czas planowania jest często krótki w przypadku powolnych zapytań, ale w wyjątkowych przypadkach może to być przyczyną większości problemu. W związku z tym pamiętaj, że te przypadki mogą nie pojawiać się w twoich dziennikach, a jeśli tak się dzieje, rozbieżność z tym, co widzisz w całkowitym opóźnieniu, może mieć związek z czasem planowania. Instrukcja WYJAŚNIJ ANALIZĘ szybko pomoże Ci to zauważyć.

Jak wykorzystać dane wyjściowe wyjaśniania do przyspieszenia zapytań

Po uzyskaniu wyjaśnień dla najwolniejszych zapytań możesz teraz zacząć zastanawiać się nad ich przyspieszeniem!

Musisz pobrać plany zapytań z dzienników, do których możesz użyć pgBadger, jeśli nie korzystasz z usługi zarządzanej, która robi to za Ciebie.

Przeglądanie planów EXPLAIN to sam w sobie ogromny temat. Dokumentacja PostgreSQL zawiera dobre, ale krótkie wprowadzenie do używania EXPLAIN, a artykuł Thoughbota o czytaniu EXPLAIN ANALYZE jest dobrym następnym krokiem. Jeśli wolisz godzinną rozmowę, EXPLAIN Explained by Josh Berkus był doskonały. Aby uzyskać więcej informacji, Depesz ma serię postów zatytułowanych Wyjaśnianie niewytłumaczalnego, a zespół pgMustard ma dość obszerny słowniczek WYJAŚNIJ.

Jeśli potrzebujesz pomocy ekspertów PostgreSQL w zarządzaniu bazami danych i przyspieszeniu powolnych zapytań, wypróbuj ScaleGrid. Zapewniamy bezpłatną całodobową pomoc techniczną na poziomie przedsiębiorstwa, która poprowadzi Cię przez te powolne zapytania i pomoże zoptymalizować je wszystkie. Nasza bezpłatna 30-dniowa wersja próbna zapewnia mnóstwo czasu na wypróbowanie wielu funkcji PostgreSQL i innych obsługiwanych baz danych.

Mamy nadzieję, że zapewni to wszystko, czego potrzebujesz, aby rozpocząć pracę z auto_explain i przyspieszyć wszelkie powolne zapytania. Jeśli jest jeszcze coś, co chciałbyś wiedzieć, skontaktuj się z nami.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podstawy wyrażeń tabelarycznych, część 13 – Wbudowane funkcje o wartościach tabelarycznych, ciąg dalszy

  2. Luka w zabezpieczeniach Joomla SQL iniekcji

  3. Typy danych SQL:5 najgorszych wyborów, których musisz dzisiaj zatrzymać

  4. 2013 MVP Summit:krótki przegląd i spojrzenie w przód

  5. Błędy, pułapki i najlepsze praktyki T-SQL – determinizm