Identyfikowanie składników przetwarzania zapytań
Istnieją cztery oddzielne etapy wykonywania zapytania. W kolejności wykonywania następujące etapy to:
- Parsowanie
- Przekształcanie (przepisanie)
- Planowanie
- Egzekucja
Analizator
Analizator jest odpowiedzialny za sprawdzanie ciągu zapytania pod kątem prawidłowej składni. Analizator składni ma dwie główne części:
- gram.y składa się z zestawu reguł gramatycznych i odpowiednich działań.
- scan.1lexer, który rozpoznaje identyfikatory i słowa kluczowe SQL. Każde słowo kluczowe lub identyfikator powoduje utworzenie tokenu, który jest następnie przekazywany do analizatora.
Analizator tworzy drzewo zapytań, które oddziela zapytanie w możliwe do zidentyfikowania części, aby zrozumieć, które tabele są zaangażowane, jakie filtry zostały zastosowane itp. Części drzewa zapytań to:
- Typ polecenia — SELECT, INSERT, UPDATE lub DELETE.
-
pozycja w tabeli zakresu (RTE) — lista relacji, tabel
ie
, podzapytania, wyniki sprzężeń itp. W instrukcji SELECT te elementy są wyświetlane po słowie kluczowym 'FROM'. - relacja wyników — relacja wyników dla poleceń INSERT, UPDATE i DELETE jest tabelą lub widokiem, w którym zmiany mają zostać zastosowane.
- Lista docelowa — wyniki zapytania, które są identyfikowane między słowami kluczowymi SELECT i FROM. Polecenia DELETE nie generują wyniku, dlatego planista dodaje specjalny wpis, aby umożliwić wykonawcy znalezienie wiersza do usunięcia. Polecenia INSERT identyfikują nowe wiersze, które powinny przejść do relacji wyników. W przypadku poleceń UPDATE lista docelowa opisuje nowe wiersze, które powinny zastąpić stare.
- Kwalifikacja — wartość boolowska określająca, czy operacja dla końcowego wiersza wyników powinna zostać wykonana. Odpowiada klauzuli WHERE instrukcji SQL.
- Drzewo złączeń — może to być lista elementów FROM. Sprzężenia można wykonać w dowolnej kolejności lub wykonać w określonej kolejności, na przykład sprzężenia zewnętrzne.
- inne — elementy, które nie są istotne na tym etapie, takie jak klauzula ORDER BY.
Nagrywarka
Dane wyjściowe analizatora są przekazywane do procesu przekształcania lub ponownego tworzenia, chyba że zostanie znaleziony błąd, w którym to przypadku zostanie zwrócony komunikat o błędzie.
Przepisujący zapytanie przepisuje tekst zapytania, stosując na niego reguły . Przepisownik bierze pod uwagę reguły, a następnie przekazuje zmodyfikowane zapytanie do planisty zapytań. Zabezpieczenia na poziomie wiersza są implementowane na tym etapie.
Na przykład reguły select są zawsze stosowane jako ostatni krok, w tym w przypadku zapytań INSERT, UPDATE i DELETE. Reguły oznaczają również, że zapytania UPDATE nie zastępują istniejących wierszy, a nowy wiersz jest wstawiany, a stary wiersz jest ukryty. Po zatwierdzeniu transakcji proces odkurzania może usunąć ukryty wiersz.
Planista
Zadaniem planisty jest podjęcie reguł zapytania i zrozumienie, które z różnych sposobów wykonywania zapytania jest najszybsze.
Planista tworzy drzewo planu z węzłami reprezentującymi operacje fizyczne na danych.
Usługa PostgreSQL używa optymalizatora zapytań opartego na kosztach, aby znaleźć optymalny plan zapytania. Planista ocenia różne plany wykonywania i szacuje, ile wymaganych zasobów jest potrzebnych, takich jak cykle procesora CPU, operacje we/wy itp. To oszacowanie jest następnie konwertowane na jednostki znane jako koszt planu . Wybrano plan o najniższym koszcie.
Jednak wraz ze wzrostem liczby łączeń liczba możliwych planów rośnie wykładniczo. Ocena każdego możliwego planu staje się niemożliwa nawet w przypadku stosunkowo prostych zapytań. Algorytmy i heurystyka służą do ograniczania liczby możliwych planów. Wynikiem jest to, że wybrany plan może nie być optymalnym planem. Jest to jednak niemal optymalne i wybrane w rozsądnym czasie.
Koszt jest najlepszym oszacowaniem planisty. Celem szacowania kosztów jest porównanie różnych planów wykonawczych dla tego samego zapytania w tych samych warunkach. Planista wykorzystuje statystyki zebrane dla tabel i wierszy, aby oszacować koszty związane z zapytaniami. Aby oszacowania kosztów były dokładne, statystyki muszą być aktualne.
Aktualne statystyki
Składnik planisty optymalizatora zapytań używa statystyk dotyczących tabel i wierszy w celu uzyskania dokładnych szacunków kosztów.
Funkcja ANALYZE zbiera statystyki dotyczące tabel baz danych i przechowuje wyniki w katalogu systemu pg_statistic. Musisz uruchomić polecenie ANALYZE, jeśli:
- Wyłączyłeś autovacuum (który zazwyczaj automatycznie analizuje tabele)
- Wyłączyłeś autovacuumi ostatnio nie uruchomiłeś funkcji ANALYZE.
- Jeden z poprzednich i istnieje wiele instrukcji INSERTS, UPDATES lub DELETE.
Oszacowania kosztów opierają się na statystykach dotyczących up-to— dat, a jeśli statystyki są nieaktualne, to można wybrać nieefektywny plan. Jeśli żaden parametr nie jest przekazywany do funkcji ANALYZE, każda tabela w bazie danych jest badana.
Składnia funkcji ANALYZE to:
ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]
Funkcja VERBOSE wyświetla komunikaty postępu, aby pokazać, która tabela jest analizowana wraz z niektórymi statystykami.
Zaplanuj opróżnienie i analizę, aby uruchamiać codziennie w czasie niskiego użycia. Funkcja ANALYZE może działać równolegle z innymi działaniami, ponieważ wymaga tylko blokady odczytu w tabeli docelowej.
Wykonawca
Ta faza pobiera plan utworzony przez planistę i przetwarza go rekursywnie w celu wyodrębnienia wymaganego zestawu wierszy. Za każdym razem, gdy węzeł planu jest nazywany wykonawcą, musi dostarczyć wiersz lub zgłosić raport z powrotem, aby powiedzieć, że został ukończony.
Funkcja wykonawcza ocenia wszystkie cztery typy zapytań SQL:
- WYBRAĆ
- WSTAWIAĆ
- AKTUALIZACJA
- Usuń
W przypadku SELECTfunkcja wykonawcza zwraca każdy wiersz z powrotem do klienta jako zestaw wyników.
W przypadku INSERTkażdy zwrócony wiersz jest wstawiany do określonej tabeli. To zadanie jest wykonywane w specjalnym węźle planu najwyższego poziomu o nazwie ModifyTable.
W przypadku UPDATE, każdy obliczony wiersz zawiera wszystkie zaktualizowane wartości kolumn oraz identyfikator wiersza docelowego. Dane są wysyłane do węzła ModifyTable, który tworzy zaktualizowany wiersz i oznacza stary wiersz jako usunięty.
W przypadku DELETEjedyną kolumną zwracaną przez plan jest identyfikator wiersza. Węzeł ModifyTable używa identyfikatora wiersza do oznaczania wiersza jako usuniętego.