SQL Academy · Lekcja

Identyfikowanie i naprawianie powolnych zapytań

Korzystać z pg_stat_statements, log_min_duration_statement i EXPLAIN, aby znajdować powolne zapytania i stosować ukierunkowane poprawki

Lekcja 4 z 414 kroki

Identyfikowanie i naprawianie powolnych zapytań to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Krok 1: Znajdź wolne zapytania

Nie należy optymalizować w ciemno. Należy użyć:

  • pg_stat_statements — najczęściej wykonywane zapytania według łącznego czasu
  • log_min_duration_statement — rejestrowanie zapytań przekraczających określony próg
  • pgBadger — czytelne raporty na podstawie logów

Konfiguracja pg_stat_statements

Należy włączyć rozszerzenie i skonfigurować shared_preload_libraries:

-- postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

-- After restart:
CREATE EXTENSION pg_stat_statements;

10 najbardziej obciążających zapytań

Najbardziej użyteczne zapytanie dla każdego administratora baz danych:

SELECT query,
       calls,
       total_exec_time,
       mean_exec_time,
       rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Rejestrowanie wolnych zapytań

Należy ustawić próg i odczytać dziennik:

-- postgresql.conf
log_min_duration_statement = '500ms'
-- All queries running > 500ms are logged.

Krok 2: Odtwórz problem za pomocą EXPLAIN ANALYZE

Dla każdego wolnego zapytania uruchom EXPLAIN ANALYZE w reprezentatywnym środowisku, zawierającym dane podobne do produkcyjnych. Sprawdź:

  • Węzeł o największym rzeczywistym czasie wykonania
  • Największą różnicę między szacowaną a rzeczywistą liczbą wierszy
  • Czy używane są właściwe indeksy

Typowe rozwiązania

  • Brak indeksu dla kolumny używanej w WHERE lub JOIN
  • Predykat niebędący sargable (funkcja zastosowana do kolumny) — należy dodać indeks na wyrażeniu lub przepisać zapytanie
  • Nieaktualne statystyki — uruchomić ANALYZE
  • Nieprawidłowy typ danych (powodujący niejawne rzutowanie) — poprawić typ kolumny
  • Warunki OR — przepisać jako UNION zapytań z pojedynczym warunkiem
  • SELECT * pobierający zbyt dużo danych — ograniczyć listę zwracanych kolumn

Nieaktualne statystyki

Jeśli szacowana liczba wierszy znacznie różni się od rzeczywistej, najpierw uruchom ANALYZE:

ANALYZE orders;
-- Or rely on autovacuum to do it periodically.

Kontrola poprawności indeksów

Wyświetlenie indeksów tabeli i ich rozmiarów:

SELECT indexrelname, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE relname = 'orders'
ORDER BY pg_relation_size(indexrelid) DESC;

Nieużywane indeksy

Wyszukanie indeksów, które nigdy nie są używane:

SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
-- Consider dropping them — they slow writes for no read benefit.

Konflikty blokad

Czasami zapytanie jest „wolne”, ponieważ czeka na blokadę. Sprawdź pg_stat_activity pod kątem wait_event:

SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle';

Schematy przepisywania zapytań

  • Przenieś filtry do WHERE
  • Zastąp skorelowane podzapytanie w SELECT złączeniem JOIN + GROUP BY
  • Zastąp OR operatorem UNION ALL dla zapytań z indeksami
  • Użyj funkcji okienkowych zamiast złączeń tabeli z samą sobą
  • Zmaterializuj powtarzające się podzapytania za pomocą CTE (gdy planista ma trudności z wyborem planu)

Iteracja

Dostrajanie wydajności to cykl: zmierz → postaw hipotezę → wprowadź zmianę → zmierz. Nie należy zgadywać.

Podsumowanie

Wolne zapytania należy znajdować za pomocą pg_stat_statements, diagnozować za pomocą EXPLAIN ANALYZE, naprawiać przy użyciu indeksów, ANALYZE lub przepisania zapytania, a następnie ponownie mierzyć wyniki.

Szybki test

Które rozszerzenie PostgreSQL pokazuje zapytania zużywające najwięcej czasu według łącznego czasu wykonania?

Bezpłatny start

Ucz się SQL dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
46
Lekcje
183

Często zadawane pytania

Czy lekcja „Identyfikowanie i naprawianie powolnych zapytań” jest bezpłatna?

Tak — pełny tekst „Identyfikowanie i naprawianie powolnych zapytań” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Identyfikowanie i naprawianie powolnych zapytań”?

Korzystać z pg_stat_statements, log_min_duration_statement i EXPLAIN, aby znajdować powolne zapytania i stosować ukierunkowane poprawki Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Identyfikowanie i naprawianie powolnych zapytań”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Odczytywanie EXPLAIN i EXPLAIN ANALYZE
  2. Skanowanie sekwencyjne a skanowanie indeksu
  3. Hash Join a Merge Join a Nested Loop
  4. Identyfikowanie i naprawianie powolnych zapytań
← Powrót do SQL Academy