Odczytywanie EXPLAIN i EXPLAIN ANALYZE
Czytać drzewo planu, rozumieć różnicę między kosztem a rzeczywistym czasem i wskazywać najbardziej obciążone węzły
Odczytywanie EXPLAIN i EXPLAIN ANALYZE to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 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.
Dlaczego EXPLAIN?
EXPLAIN pokazuje strategię planisty dotyczącą wykonania zapytania — bez jego uruchamiania. EXPLAIN ANALYZE uruchamia zapytanie ORAZ pokazuje rzeczywiste czasy wykonania.
Podstawowe EXPLAIN
Wyświetlanie oszacowanego planu:
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- QUERY PLAN
-- ---------------------------------------------------------------
-- Index Scan using orders_user_id_idx on orders
-- (cost=0.43..8.45 rows=5 width=120)
-- Index Cond: (user_id = 42)EXPLAIN ANALYZE
Uruchamia zapytanie i dodaje rzeczywiste czasy wykonania oraz liczby wierszy:
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42;
-- Index Scan using orders_user_id_idx on orders
-- (cost=0.43..8.45 rows=5 width=120)
-- (actual time=0.041..0.043 rows=4 loops=1)
-- Planning Time: 0.082 ms
-- Execution Time: 0.057 msOdczytywanie drzewa
Plany są drzewami. Wcięcie oznacza węzeł podrzędny. Węzły podrzędne są wykonywane przed nadrzędnymi.
Aggregate
-> Hash Join
Hash Cond: (o.user_id = u.id)
-> Seq Scan on orders
-> Hash
-> Seq Scan on usersKoszt a czas
Kolumna cost zawiera DWIE liczby: startup_cost..total_cost. Są to umowne jednostki planisty, a nie sekundy. Rzeczywistych wartości należy szukać w actual time.
rows = oszacowanie; actual rows = rzeczywista wartość
rows to szacunek planisty. actual rows pokazuje rzeczywisty wynik. Jeśli wartości znacznie się różnią, statystyki są nieprawidłowe.
Pętle zwielokrotniają czas
W przypadku pętli zagnieżdżonych zapis actual time=X loops=N oznacza, że każda iteracja trwała X, a całkowity czas dla danego węzła wynosi X×N.
Nested Loop (actual time=0.05..2.03 rows=500)
-> Seq Scan on orders (actual ... loops=1)
-> Index Scan using users_pkey (actual time=0.01..0.01 loops=500)BUFFERS pokazuje operacje I/O
EXPLAIN (ANALYZE, BUFFERS) podaje liczbę trafień do buforów i odczytów — czyli operacje I/O stojące za zmierzonymi czasami:
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-- Buffers: shared hit=12 read=4Opcje FORMAT
Do przetwarzania programowego należy użyć formatu JSON lub YAML:
EXPLAIN (ANALYZE, FORMAT JSON) SELECT ...;Nie używaj EXPLAIN ANALYZE dla instrukcji modyfikujących dane
EXPLAIN ANALYZE dla instrukcji UPDATE/DELETE/INSERT faktycznie ją wykonuje. Jeśli chce Pan/Pani ją przeanalizować bez zatwierdzania zmian, należy użyć transakcji zakończonej instrukcją ROLLBACK:
BEGIN;
EXPLAIN ANALYZE DELETE FROM orders WHERE ...;
ROLLBACK;Typowe węzły planu
- Seq Scan — odczytuje całą tabelę
- Index Scan — używa indeksu
- Bitmap Heap Scan — łączy wiele indeksów
- Hash Join / Merge Join / Nested Loop — strategie złączania
- Sort, Aggregate, Limit, Materialize
Przebieg analizy planu
- Uruchomić EXPLAIN ANALYZE dla wolnego zapytania
- Znajdź węzeł o największej wartości
actual time - Porównaj szacowaną wartość
rowsz wartościąactual rows - Sprawdź, czy używane są indeksy
- Powtarzaj: dodaj indeks, przepisz zapytanie lub uruchom ANALYZE
Podsumowanie
EXPLAIN ANALYZE to podstawowe narzędzie do analizy wydajności.
- Koszt jest względny, a czas — rzeczywisty
- Porównanie szacowanej i rzeczywistej liczby wierszy ujawnia problemy ze statystykami
- BUFFERS pokazuje operacje I/O
- Zapytania modyfikujące dane należy umieszczać między BEGIN a ... ROLLBACK
Szybki test
Jaka jest różnica między EXPLAIN a EXPLAIN ANALYZE?
Często zadawane pytania
Czy lekcja „Odczytywanie EXPLAIN i EXPLAIN ANALYZE” jest bezpłatna?
Tak — pełny tekst „Odczytywanie EXPLAIN i EXPLAIN ANALYZE” 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 „Odczytywanie EXPLAIN i EXPLAIN ANALYZE”?
Czytać drzewo planu, rozumieć różnicę między kosztem a rzeczywistym czasem i wskazywać najbardziej obciążone węzły Ć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 1 z 4.
Ile czasu zajmuje lekcja „Odczytywanie EXPLAIN i EXPLAIN ANALYZE”?
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ń