Identyfikowanie składników przetwarzania zapytań

Ukończone

Istnieją cztery oddzielne etapy wykonywania zapytania. W kolejności wykonywania następujące etapy to:

  1. Parsowanie
  2. Przekształcanie (przepisanie)
  3. Planowanie
  4. 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.