Plan zapytania

Opis kroków, jakie baza wykona, by zrealizować zapytanie. Analizowany poleceniem EXPLAIN przy optymalizacji wydajności.

Plan zapytania (ang. query execution plan) to lista kroków, jakie silnik bazy danych zamierza wykonać, żeby zrealizować Twoje zapytanie SQL. Mówi, w jakiej kolejności baza odczyta tabele, czy skorzysta z indeksu czy przejedzie całą tabelę wiersz po wierszu, jak połączy dane (JOIN), jak je posortuje i pogrupuje. Krótko: to przepis na wynik, a nie sam wynik.

Kluczowe jest to, że Ty piszesz, CO chcesz dostać, a baza sama decyduje JAK to policzyć. Robi to komponent zwany query optimizer (planerem). Dla jednego zapytania istnieje zwykle wiele możliwych dróg, a optymalizator szacuje koszt każdej z nich na podstawie statystyk (ile wierszy ma tabela, jak rozkładają się wartości w kolumnach) i wybiera tę najtańszą. Dlatego dwa pozornie identyczne zapytania mogą dostać różne plany, gdy zmieni się rozmiar danych albo statystyki się zdezaktualizują.

Jak to podejrzeć w praktyce

Plan wyciągasz poleceniem EXPLAIN. W PostgreSQL napiszesz np.:

EXPLAIN SELECT * FROM zamowienia WHERE klient_id = 42;

Dostaniesz drzewo operacji z szacowanym kosztem (cost) i liczbą wierszy (rows). Jeśli chcesz wiedzieć, jak było naprawdę, a nie tylko w teorii, użyj EXPLAIN ANALYZE — baza wtedy faktycznie wykona zapytanie i pokaże rzeczywiste czasy oraz liczby wierszy. Typowy moment „aha” to zobaczenie Seq Scan (pełny skan tabeli) tam, gdzie spodziewałeś się Index Scan — sygnał, że brakuje indeksu albo baza uznała, że i tak czytasz większość tabeli. W MySQL zadziała EXPLAIN, a od wersji 8.0 również EXPLAIN ANALYZE.

Na co uważać

  • Szacunki to nie pomiary. Liczby przy zwykłym EXPLAIN to prognozy optymalizatora. Realny czas pokaże dopiero EXPLAIN ANALYZE — ale pamiętaj, że ono wykonuje zapytanie, więc nie odpalaj go ot tak na DELETE czy UPDATE bez transakcji.
  • Nieaktualne statystyki = głupie plany. Gdy planer wybiera dziwną drogę, często pomaga odświeżenie statystyk (ANALYZE w PostgreSQL).
  • Seq Scan to nie zawsze zło. Przy małej tabeli pełny skan bywa szybszy niż skakanie po indeksie.
  • Czytaj drzewo od środka. Najgłębiej zagnieżdżone węzły wykonują się jako pierwsze — tam zwykle siedzi wąskie gardło.

Pojęcia powiązane: query optimizer, indeks, statystyki bazy danych, full table scan (seq scan), JOIN, EXPLAIN ANALYZE, koszt zapytania.