Identifikace komponent zpracování dotazů
Spuštění dotazu má čtyři samostatné fáze. V pořadí provádění jsou tyto fáze:
- Syntaktická analýza
- Transformace (přepisovač)
- Plánování
- Provedení
Analyzátor
Analyzátor zodpovídá za kontrolu platné syntaxe řetězce dotazu. Analyzátor má dvě hlavní části:
- gram.y , která se skládá ze sady gramatických pravidel a odpovídajících akcí.
- scan.1 ten lexer, který rozpozná identifikátory a klíčová slova SQL. Každé použité klíčové slovo nebo identifikátor spustí vytvoření tokenu, který je následně předán syntaktickému analyzátoru.
Analyzátor sestaví strom dotazu, který rozdělí dotaz na identifikovatelné části, aby porozuměl tomu, které tabulky se týkají, jaké filtry byly použity atd. Části stromu dotazu jsou:
- Typ příkazu – SELECT, INSERT, UPDATE nebo DELETE.
-
Položka tabulky rozsahu (RTE) – seznam relací,
ietabulek, poddotazů, výsledků spojení atd. V příkazu SELECT se tyto položky zobrazí za klíčovým slovem FROM. - Relační výsledek – výsledná relace pro příkazy INSERT, UPDATE a DELETE je tabulka nebo zobrazení, kde se změny projeví.
- Cílový seznam – výsledky dotazu identifikované mezi klíčovými slovy SELECT a FROM. Příkazy DELETE nevygenerují výsledek, takže plánovač přidá speciální položku, která exekutoru umožní najít řádek, který se má odstranit. Příkazy INSERT identifikují nové řádky, které by měly přecházet do vztahu výsledků. V případě příkazů UPDATE popisuje cílový seznam nové řádky, které by měly nahradit staré řádky.
- kvalifikace – logická hodnota, která určuje, jestli má být operace pro poslední řádek výsledku provedena nebo ne. Odpovídá klauzuli WHERE příkazu SQL.
- Spojovací strom – tento strom může obsahovat seznam položek z FROM. Spojení lze provést v libovolném pořadí nebo provést v určitém pořadí, jako jsou vnější spojení.
- Ostatní – položky, které nejsou v této fázi relevantní, například klauzule ORDER BY.
Přepisovač
Výstup analyzátoru se předá procesu transformace nebo přepsání, pokud není nalezena chyba; v takovém případě se vrátí chybová zpráva.
Přepisovač dotazu přepíše text dotazu použitím pravidel . Rewriter bere v úvahu pravidla a pak předá upravený dotaz plánovači dotazů. V této fázi se implementuje zabezpečení na úrovni řádků.
Pravidla pro SELECT se například vždy použijí jako poslední krok, včetně dotazů INSERT, UPDATE a DELETE. Pravidla také znamenají, že dotazy UPDATE nepřepíší existující řádky, místo toho se vloží nový řádek a starý řádek je skrytý. Po potvrzení transakce může proces vakua odebrat skrytý řádek.
Plánovač
Úkolem plánovače je vzít pravidla dotazu a pochopit, které z různých způsobů, jak by se dotaz mohl spustit, je nejrychlejší.
Plánovač vytvoří strom plánu s uzly představujícími fyzické operace s daty.
PostgreSQL používá optimalizátor dotazů založený na nákladech k vyhledání optimálního plánu dotazu. Plánovač vyhodnocuje různé plány provádění a odhaduje, kolik požadovaných prostředků je potřeba, jako jsou cykly procesoru, vstupně-výstupní operace atd. Tento odhad se pak převede na jednotky označované jako náklady na plán. Je vybrán plán s nejnižšími náklady.
S rostoucím počtem spojení se ale exponenciálně zvýší počet možných plánů. Vyhodnocení každého možného plánu se stává nemožné i pro relativně jednoduché dotazy. Heuristika a algoritmy se používají k omezení počtu možných plánů. Výsledkem je, že vybraný plán nemusí být optimální. Je vybrán v přiměřené době a je však téměř optimální.
Náklady jsou nejlepším odhadem plánovače. Účelem odhadu nákladů je porovnat různé plány provádění pro stejný dotaz ve stejných podmínkách. Plánovač používá statistiky shromážděné v tabulkách a řádcích k vytváření odhadů nákladů pro dotazy. Aby odhady nákladů byly přesné, musí být statistiky aktuální.
Aktuální statistika
Komponenta planneru optimalizátoru dotazů používá k vytvoření přesných odhadů nákladů statistiky o tabulkách a řádcích.
FUNKCE ANALYZE shromažďuje statistiky o databázových tabulkách a ukládá výsledky v katalogu systému pg_statistic . Je potřeba spustit funkci ANALYZE, pokud:
- Vypnuli jste funkci autovacuum (která normálně analyzuje tabulky automaticky).
- Zakázali jste autovacuum a nedávno jste nespustili funkci ANALYZE.
- Jeden z předchozích příkazů a existuje mnoho příkazů INSERTS, UPDATES nebo DELETE.
Odhady nákladů spoléhají na statistiky k up-to, a pokud jsou statistiky zastaralé, může být zvolen neefektivní plán. Pokud funkci ANALYZE nepředáte žádný parametr, prověří se každá tabulka v databázi.
Syntaxe funkce ANALYZE je:
ANALYZE [ VERBOSE ] [ ***table*** [ ( ***column*** [, ...] ) ] ]
Funkce VERBOSE zobrazuje zprávy o průběhu, které ukazují, která tabulka se analyzuje, spolu s některými statistikami.
Naplánujte úlohy VACUUM a ANALYZE tak, aby se spouštěly každý den během doby nízkého zatížení. Funkce ANALYZE může běžet paralelně s jinými aktivitami, protože vyžaduje pouze zámek pro čtení v cílové tabulce.
Vykonavatel
Tato fáze vezme plán vytvořený plánovačem a rekurzivně ho zpracuje, aby extrahovala požadovanou sadu řádků. Pokaždé, když je volán uzel plánu, musí vykonávací jednotka doručit řádek nebo oznámit, že je dokončen.
Exekutor vyhodnotí všechny čtyři typy dotazů SQL:
- SELECT
- VLOŽIT
- AKTUALIZACE
- VYMAZAT
V případě příkazu SELECT vrátí exekutor každý řádek zpět klientovi jako sadu výsledků.
U funkce INSERT se každý vrácený řádek vloží do zadané tabulky. Tento úkol se provádí ve speciálním uzlu plánu nejvyšší úrovně s názvem ModifyTable.
U funkce UPDATE zahrnuje každý počítaný řádek všechny aktualizované hodnoty sloupců a ID řádku cílového řádku. Data se odešlou do uzlu ModifyTable, který vytvoří aktualizovaný řádek a označí starý řádek jako odstraněný.
Pro DELETE je plánem vrácen pouze jediný sloupec, a to ID řádku. Uzel ModifyTable používá ID řádku k označení řádku jako odstraněného.