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
EXPLAINto prognozy optymalizatora. Realny czas pokaże dopieroEXPLAIN ANALYZE— ale pamiętaj, że ono wykonuje zapytanie, więc nie odpalaj go ot tak naDELETEczyUPDATEbez transakcji. - Nieaktualne statystyki = głupie plany. Gdy planer wybiera dziwną drogę, często pomaga odświeżenie statystyk (
ANALYZEw 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.