0Pricing
SQL Academy · Lekcja

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 ms

Odczytywanie 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 users

Koszt 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=4

Opcje 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

  1. Uruchomić EXPLAIN ANALYZE dla wolnego zapytania
  2. Znajdź węzeł o największej wartości actual time
  3. Porównaj szacowaną wartość rows z wartością actual rows
  4. Sprawdź, czy używane są indeksy
  5. 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

  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