Identifikace komponent zpracování dotazů

Dokončeno

Spuštění dotazu má čtyři samostatné fáze. V pořadí provádění jsou tyto fáze:

  1. Analýza
  2. Transformace (rewriter)
  3. Plánování
  4. Provádění

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 lexer, který rozpozná identifikátory a klíčová slova SQL. Každé klíčové slovo nebo identifikátor aktivuje vytvoření tokenu a předání 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í, ie tabulek, 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 se má provést operace pro poslední řádek výsledků. Odpovídá klauzuli WHERE příkazu SQL.
  • Spojit strom – tento strom může být seznamem položek 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.

Rewriter

Výstup analyzátoru se předá procesu transformace nebo přepsání , pokud se nenajde chyba v takovém případě, že se vrátí chybová zpráva.

Autor 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.

Planner

Ú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 však téměř optimální a v přiměřené době je vybrán.

Náklady jsou nejlepší odhad 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 do systémového katalogu pg_statistic . Je potřeba spustit funkci ANALYZE, pokud:

  • Vypnuli jste funkci autovacuum (která normálně analyzuje tabulky automaticky).
  • Vypnuli jste automatické úklidy a nedávno nespustíte funkci ANALYZE.
  • Jeden z předchozích příkazů a existuje mnoho příkazů INSERTS, UPDATES nebo DELETE.

Odhady nákladů využívají aktuální statistiky a pokud jsou statistiky zastaralé a je možné zvolit 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 úklid a analýzu tak, aby běžely každý den během doby nízkého využití. Funkce ANALYZE může běžet paralelně s jinými aktivitami, protože vyžaduje pouze zámek pro čtení v cílové tabulce.

Exekutor

Tato fáze vezme plán vytvořený plánovačem a zpracuje ho rekurzivně, aby extrahovaly požadovanou sadu řádků. Pokaždé, když se uzel plánu nazývá exekutor, musí doručit řádek nebo zprávu, aby se řeklo, že byl dokončen.

Exekutor vyhodnotí všechny čtyři typy dotazů SQL:

  • VÝBĚR
  • INSERT
  • UPDATE
  • DELETE

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ý.

V případě delete je jediným sloupcem vráceným plánem ID řádku. Uzel ModifyTable používá ID řádku k označení řádku jako odstraněného.