Recenze

Postgres Pro Standard: Dokumentace: 17: 39.1. Strom dotazů: Postgres Professional

Abyste pochopili, jak systém pravidel funguje, musíte vědět, kdy je volán, co přijímá jako vstup a jaký výstup produkuje.

Systém pravidel je vložen mezi analyzátor dotazů a plánovač. Na základě analyzovaného dotazu, jednoho stromu dotazů a uživatelem definovaných pravidel pro přepis, rovněž reprezentovaných jako stromy s doplňujícími informacemi, vytvoří určitý počet stromů dotazů. Vstup a výstup tohoto systému jsou tedy to, co dokáže analyzátor dotazů vygenerovat, a v důsledku toho je vše, s čím systém pracuje, reprezentovatelné jako příkazy SQL.

Co je tedy strom dotazů? Je to interní reprezentace příkazu SQL, kde jsou všechny části, které jej tvoří, uloženy odděleně. Tyto stromy lze zobrazit v protokolu serveru, pokud nastavíte konfigurační parametry debug_print_parse, debug_print_rewritten nebo debug_print_plan. Akce pravidel jsou také uloženy jako stromy dotazů v systémovém katalogu pg_rewrite. Nejsou formátovány tak, jak jsou při výstupu do protokolu, ale obsahují přesně stejné informace.

Čtení neformátovaného stromu vyžaduje určitou dovednost. Jelikož však SQL reprezentace stromu dotazů postačuje k pochopení systému pravidel, tato kapitola se nebude zabývat tím, jak je číst.

Při čtení SQL reprezentací stromů dotazů v této kapitole je důležité pochopit, na které části je příkaz rozdělen při převodu do struktury stromu dotazů. Strom dotazů se skládá z následujících částí:

Toto je jednoduchá hodnota, která určuje, který příkaz (SELECT, INSERT, UPDATE nebo DELETE) vygeneroval seznam relací ve stromu dotazů.

Seznam vztahů je pole vztahů použitých v dotazu. V dotazu SELECT obsahuje vztahy uvedené za klíčovým slovem FROM.

Každý prvek relačního seznamu představuje tabulku nebo pohled a určuje, pod jakým názvem se na něj odkazuje v ostatních částech dotazu. Strom dotazu zaznamenává čísla prvků relačního seznamu, nikoli jejich názvy, takže netrpí problémem duplicitních názvů, který se vyskytuje u příkazů SQL. Tento problém může nastat při kombinování relačních seznamů vytvořených podle různých pravidel. Tato situace nebude v této kapitole uvažována. výsledná relace

Index v seznamu relací, který ukazuje na relaci, jež bude přijímat výsledky dotazu.

Dotazy SELECT nemají relaci výsledku. (Speciální případ příkazu SELECT INTO je v podstatě ekvivalentní příkazu CREATE TABLE následovanému příkazem INSERT. Příkaz SELECT zde není samostatně probírán.)

Pro příkazy INSERT, UPDATE a DELETE bude výslednou relací tabulka (nebo pohled!), kde dojde ke změnám. výstupní seznam

Výstupní seznam je seznam výrazů, které určují výsledek dotazu. V případě SELECT se jedná o výrazy, které tvoří finální výstupní sadu. Odpovídají výrazům zapsaným mezi klíčová slova SELECT a FROM. (Specifikátor * je pouze zkratka pro názvy všech sloupců v relaci. Analyzátor jej rozbalí do seznamu jednotlivých sloupců, takže systém pravidel jej nikdy nevidí.)

Příkazy DELETE nevyžadují běžný výstupní seznam, protože neprodukují žádné výsledky. Místo toho plánovač přidá do prázdného výstupního seznamu speciální položku CTID, aby vykonavatel mohl najít řádek, který má být odstraněn. (CTID se přidá, pokud je výsledná relace běžná tabulka. Pokud se jedná o pohled, plánovač přidá proměnnou obsahující celý řádek, jak je popsáno v části 39.2.4.)

Přečtěte si více
Antennaria neboli Kočičí tlapka je nenáročný půdní kryt. Pěstování, výsadba, péče. Fotografie — Botanichka

U příkazů INSERT popisuje výstupní seznam nové řádky, které by měly jít do relace výsledek. Zahrnuje výrazy v klauzuli VALUES nebo klauzuli SELECT příkazu INSERT.SELECT. V prvním kroku proces přepisování přidá do výstupního seznamu položky pro sloupce, kterým původní příkaz nic nepřiřadil, ale mají výchozí hodnoty. Plánovač vyplní všechny ostatní sloupce (bez zadané hodnoty nebo s výchozí hodnotou) konstantou NULL.

U příkazů UPDATE výstupní seznam popisuje nové řádky, které by měly nahradit staré. V systému pravidel obsahuje pouze výrazy z části SET column = expression. U chybějících sloupců plánovač vkládá výrazy, které kopírují hodnoty ze starého řádku do nového. Stejně jako u příkazu DELETE je zde zahrnuto CTID nebo proměnná s celým řádkem, aby vykonavatel mohl najít starý řádek, který je upravován.

Každý záznam ve výstupním seznamu obsahuje výraz, kterým může být konstanta, proměnná odkazující na sloupec relace v relační tabulce, parametr nebo strom výrazů tvořený konstantami, proměnnými, operátory, voláními funkcí atd. podmínka filtru

Podmínka filtru dotazu je výraz podobný těm ve výstupním seznamu. Výsledkem tohoto výrazu je logický výraz, který říká, zda má být na daném řádku ve výsledku provedena operace (INSERT, UPDATE, DELETE nebo SELECT). Odpovídá klauzuli WHERE v příkazu SQL. join tree

Strom spojení v dotazu zobrazuje strukturu klauzule FROM. U jednoduchých dotazů jako SELECT, FROM a, b, c je strom spojení jednoduše seznamem položek FROM, protože je lze spojovat v libovolném pořadí. U výrazů JOIN, zejména vnějších spojení, však musíte spojovat relace v určitém pořadí. V tomto případě strom spojení odráží strukturu výrazů JOIN. Omezení spojená s konkrétními klauzulemi JOIN (z výrazů ON nebo USING) jsou také uložena jako podmíněné výrazy připojené k příslušným uzlům ve stromu spojení. Jak se ukázalo, výraz WHERE nejvyšší úrovně je také pohodlně uložen jako podmínka připojená k prvku nejvyšší úrovně stromu spojení. Strom spojení tedy ve skutečnosti představuje klauzule FROM i WHERE příkazu SELECT.

Jiné části stromu dotazů, jako například klauzule ORDER BY, nejsou v tomto kontextu zajímavé. Systém pravidel v nich při aplikaci pravidel provádí určité substituce, ale to přímo nesouvisí se základy systému pravidel.

Předch nahoře Další
Kapitola 39. Systém pravidel začátek 39.2. Systém pravidel a reprezentací

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button