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 akcji.
  • scan.1analizator leksykalny, 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.
  • Wpis w tabeli zakresu (RTE) — lista relacji, ie tabel, podzapytań, wyników sprzężeń itp. W instrukcji SELECT te elementy pojawiają się po słowie kluczowym FROM.
  • Relacja wyników — relacja wyniku dla poleceń INSERT, UPDATE i DELETE jest tabelą lub widokiem, w którym zmiany mają obowiązywać.
  • Lista docelowa — wyniki zapytania zidentyfikowane 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ść logiczna określająca, czy należy wykonać operację dla końcowego wiersza wyników. Odpowiada klauzuli WHERE instrukcji SQL.
  • Drzewo złączeń — to drzewo może być listą 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 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 wykonania 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óre zwykle automatycznie analizuje tabele)
  • Wyłączyłeś autovacuum i nie uruchomiłeś ostatnio 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 funkcji SELECT funkcja wykonawcza zwraca każdy wiersz z powrotem do klienta jako zestaw wyników.

W przypadku funkcji INSERT każ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.

Dla aktualizacji 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 polecenia DELETE jedyną kolumną, którą zwraca plan, jest identyfikator wiersza. Węzeł ModifyTable używa identyfikatora wiersza do oznaczania wiersza jako usuniętego.