Przejdź do głównej treści
eLearner.app
Moduł 10 · Lekcja 2 z 438/57 w kursie~15 min
Lekcje modułu (2/4)

EXPLAIN i ANALYZE

Czy zastanawiałeś się kiedyś, w jaki sposób baza danych decyduje, czy użyć tego ładnego indeksu, który właśnie utworzyłeś? Gdy tylko naciśniesz Enter w zapytaniu (powiedzmy, długim łączeniu z grupą powiązaną według), Planer zapytań na bieżąco oblicza dziesiątki strategii w celu wykonania zapytania i wybiera tę, która teoretycznie jest najszybsza.

Ale jako programista musisz móc zajrzeć do mrocznego umysłu Planisty zapytań.

WYJAŚNIĆ

Aby dowiedzieć się, jak Planner zamierza postępować, po prostu umieść magiczne słowo EXPLAIN na początku zapytania.

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

Rezultatem nie będą zamówienia! Zamiast tego zobaczysz plan w wynikach (z szacunkowymi statystykami):

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

To nam mówi:

  1. Planista użyje Seq Scan (brute, sekwencyjny odczyt całego dysku). Źle, jeśli są miliardy zamówień.
  2. Szacuje, że zostanie zwróconych około 15 wierszy i oblicza „koszt” w cyklach wstępnie załadowanego procesora.

WYJAŚNIJ ANALIZĘ

Podczas gdy EXPLAIN opiera się na domysłach algorytmicznych (w oparciu o globalne statystyki obliczone w ciągu ostatnich kilku godzin na danych), EXPLAIN ANALYZE faktycznie uruchamia zapytanie (i czeka na pełne wyniki logiczne), porównując rzeczywisty czas, który upłynął, w wartościach matematycznie bezwzględnych.

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
Index Scan using idx_orders_cust on orders  (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
  Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 ms

Brawo! Tutaj dowiesz się, że baza danych zdecydowała się zastosować Skanowanie indeksu na naszym dodatkowym indeksie idx_orders_cust, co zajmuje mikroskopijny czas wykonania wynoszący jedną tysięczną sekundy i pomija miliony wierszy w locie.

Twoja kolej

Ćwiczenie#sql.m10.l2.e1
Próby: 0Ładowanie...

Napisz podstawowe polecenie EXPLAIN, aby dowiedzieć się, w jaki sposób PostgreSQL zamierza znaleźć produkty z bieżącym zapasem poniżej 10 sztuk. (Nie używaj opcji ANALIZA na tym etapie.)

Ładowanie edytora...
Pokaż wskazówkę

Wystarczy dodać słowo EXPLAIN na początku istniejącej instrukcji.

Rozwiązanie dostępne po 3 próbach

Uzyskiwanie prawdziwych danych

Ćwiczenie#sql.m10.l2.e2
Próby: 0Ładowanie...

Chcemy prawdziwej diagnozy wydajności (czasy i cykle), a nie matematycznie odgadniętego szkicu. Użyj dedykowanej instrukcji, aby przestudiować, faktycznie ją uruchamiając, wyszukiwanie WSZYSTKICH „klientów” zarejestrowanych przed 1 stycznia 2025 r. („signed_up_on” < „2025-01-01”).

Ładowanie edytora...
Pokaż wskazówkę

Dodaj słowo ANALIZA zaraz po WYJAŚNIJ.

Rozwiązanie dostępne po 3 próbach