Wynik wyjaśniający MySQL jest dość prosty. PostgreSQL jest trochę bardziej skomplikowany. Nie udało mi się znaleźć dobrego źródła, które by to wyjaśniło.
Czy możesz opisać, co dokładnie mówi wyjaśnienie lub przynajmniej wskazać mi dobre źródło informacji?
postgresql
kjg
źródło
źródło
Część, która zawsze wydawała mi się myląca, to koszt uruchomienia w porównaniu z całkowitym kosztem. Google to za każdym razem, gdy o tym zapominam, co prowadzi mnie z powrotem tutaj, co nie wyjaśnia różnicy, dlatego piszę tę odpowiedź. Oto, co zebrałem z dokumentacji Postgresa
EXPLAIN
, wyjaśnione tak , jak rozumiem.Oto przykład z aplikacji zarządzającej forum:
Oto graficzne wyjaśnienie z PgAdmin:
(Kiedy używasz PgAdmin, możesz wskazać myszą komponent, aby odczytać szczegóły kosztów).
Koszt jest przedstawiany jako krotka, np. Koszt
LIMIT
jest,cost=0.00..3.39
a koszt sekwencyjnego skanowaniapost
tocost=0.00..15629.12
. Pierwsza liczba w krotce to koszt uruchomienia, a druga liczba to całkowity koszt . Ponieważ użyłem,EXPLAIN
a nieEXPLAIN ANALYZE
, koszty te są szacunkowe, a nie rzeczywiste.Jako komplikacja, koszt każdego węzła „nadrzędnego” obejmuje koszt jego węzłów podrzędnych. W reprezentacji tekstowej drzewo jest reprezentowane przez wcięcie, np.
LIMIT
Jest węzłem macierzystym iSeq Scan
jego dzieckiem. W reprezentacji PgAdmin strzałki wskazują kierunek od dziecka do rodzica - kierunek przepływu danych - co może być sprzeczne z intuicją, jeśli znasz teorię grafów.Dokumentacja mówi, że koszty obejmują wszystkie węzły podrzędne, ale zauważ, że całkowity koszt rodzica
3.39
jest znacznie mniejszy niż całkowity koszt jego dziecka15629.12
. Całkowity koszt nie jest wliczony w cenę, ponieważ komponent taki jakLIMIT
nie musi przetwarzać całego wkładu. ZobaczEXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2;
przykład w dokumentacji PostgresEXPLAIN
.W powyższym przykładzie czas uruchamiania wynosi zero dla obu składników, ponieważ żaden składnik nie musi wykonywać żadnego przetwarzania przed rozpoczęciem zapisywania wierszy: skanowanie sekwencyjne odczytuje pierwszy wiersz tabeli i emituje go.
LIMIT
Czyta swój pierwszy wiersz, a następnie wysyła go.Kiedy komponent musiałby dużo przetwarzać, zanim zacząłby wyprowadzać jakiekolwiek wiersze? Istnieje wiele możliwych powodów, ale spójrzmy na jeden jasny przykład. Oto to samo zapytanie co wcześniej, ale teraz zawierające
ORDER BY
klauzulę:I graficznie:
Ponownie, skanowanie sekwencyjne
post
nie wiąże się z żadnymi kosztami początkowymi: natychmiast rozpoczyna wyświetlanie wierszy. Ale sortowanie wiąże się ze znacznymi kosztami początkowymi,23283.24
ponieważ musi posortować całą tabelę, zanim będzie można wyświetlić nawet jeden wiersz . Całkowity koszt sortowania23859.27
jest tylko nieznacznie wyższy niż koszt uruchomienia, co odzwierciedla fakt, że po posortowaniu całego zbioru danych posortowane dane mogą być emitowane bardzo szybko.Zauważ, że czas uruchamiania
LIMIT
23283.24
jest dokładnie równy czasowi uruchamiania tego rodzaju. Nie dzieje się tak dlategoLIMIT
, że sam ma długi czas uruchamiania. W rzeczywistości ma sam zerowy czas uruchamiania, aleEXPLAIN
sumuje wszystkie koszty podrzędne dla każdego rodzica, więcLIMIT
czas uruchamiania obejmuje sumę czasów uruchamiania jego elementów podrzędnych .Ta kumulacja kosztów może utrudnić zrozumienie kosztów wykonania każdego pojedynczego komponentu. Na przykład nasz
LIMIT
ma zerowy czas uruchamiania, ale na pierwszy rzut oka nie jest to oczywiste. Z tego powodu kilka innych osób połączyło się z wyjaśnieniem.depesz.com , narzędziem stworzonym przez Huberta Lubaczewskiego (aka depesz), które pomaga zrozumiećEXPLAIN
, między innymi, odejmując koszty dzieci od kosztów rodziców. Wspomina o innych zawiłościach w krótkim poście na blogu o swoim narzędziu.źródło
Wykonuje się od najbardziej wciętego do najmniej wciętego i uważam, że od dołu do góry. (Jeśli więc istnieją dwie sekcje z wcięciem, pierwsza jest wykonywana w pierwszej kolejności w dół strony, a gdy spotykają się z drugą, wykonywana jest reguła łącząca je).
Chodzi o to, że na każdym etapie pojawia się 1 lub 2 zestawy danych, które docierają i są przetwarzane według jakiejś reguły. Jeśli tylko jeden zestaw danych, ta operacja jest wykonywana na tym zestawie danych. (Na przykład zeskanuj indeks, aby dowiedzieć się, jakie wiersze chcesz, przefiltruj zbiór danych lub posortuj go.) Jeśli dwa, to dwa zestawy danych są dwoma elementami, które są dalej wcięte i są połączone regułą, którą widzisz. Znaczenie większości reguł można dość łatwo odgadnąć (szczególnie jeśli wcześniej przeczytałeś kilka planów wyjaśniających), jednak możesz spróbować zweryfikować poszczególne pozycje, przeglądając dokumentację lub (łatwiej), po prostu wrzucając frazę do Google wraz z kilkoma słowami kluczowymi, takimi jak
EXPLAIN
.Nie jest to oczywiście pełne wyjaśnienie, ale zapewnia wystarczający kontekst, aby zwykle można było dowiedzieć się, co chcesz. Na przykład rozważ ten plan z rzeczywistej bazy danych:
Spróbuj sam to przeczytać i sprawdź, czy ma to sens.
Czytałem, że baza danych najpierw skanuje
id_orderitem_productid
indeks, używając go do znajdowania wierszy, z których chceorderitem
, a następnie sortuje ten zestaw danych za pomocą szybkiego sortowania (użyte sortowanie zmieni się, jeśli dane nie mieszczą się w pamięci RAM), a następnie odkłada to na bok.Następnie skanuje,
orditematt_attributeid_idx
aby znaleźć żądane wiersze,orderitemattribute
a następnie sortuje ten zestaw danych za pomocą szybkiego sortowania.Następnie pobiera oba zestawy danych i łączy je. (Łączenie przez scalanie to rodzaj operacji „kompresowania”, w której dwa posortowane zbiory danych są równoległe i emituje połączone wiersze, gdy są zgodne).
Jak powiedziałem, przechodzisz przez wewnętrzną część planu do części zewnętrznej, od dołu do góry.
źródło
Dostępne jest również narzędzie pomocnicze online, Depesz , które wskaże drogie części wyników analizy.
ma również jeden, oto te same wyniki , które według mnie wyjaśniają, gdzie jest problem.
źródło
PgAdmin pokaże graficzną reprezentację planu wyjaśniania. Przełączanie się między nimi i z powrotem może naprawdę pomóc ci zrozumieć, co oznacza reprezentacja tekstu. Jeśli jednak chcesz tylko wiedzieć, co się dzieje, możesz po prostu zawsze używać GUI.
źródło
Oficjalna dokumentacja PostgreSQL dostarcza interesującego, dokładnego wyjaśnienia, jak rozumieć dane wyjściowe wyjaśnienia.
źródło
Jeśli zainstalujesz pgadmin, jest przycisk Wyjaśnij, który oprócz wyświetlania tekstu rysuje diagramy tego, co się dzieje, pokazując filtry, sortowanie i scalanie podzbiorów, które uważam za bardzo przydatne do zobaczenia, co się dzieje.
źródło