Identyfikowanie i naprawianie powolnych zapytań
Korzystać z pg_stat_statements, log_min_duration_statement i EXPLAIN, aby znajdować powolne zapytania i stosować ukierunkowane poprawki
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 czasulog_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?
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
- Odczytywanie EXPLAIN i EXPLAIN ANALYZE
- Skanowanie sekwencyjne a skanowanie indeksu
- Hash Join a Merge Join a Nested Loop
- Identyfikowanie i naprawianie powolnych zapytań