Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Jak se liší náklady na operace I/O mezi indexovými skenováními a skenováním stolů


Jak se liší náklady na operace I/O mezi indexovými skenováními a skenováním stolů


Náklady na I/O operacemi mezi skenováním indexu a skenováním tabulky se v zásadě liší, pokud jde o to, jak jsou data přístupná, počet stránek, a účinnost založená na selektivitě dotazů a organizaci dat.

Skenování indexu zahrnuje přístup k datům procházením indexové struktury (často B-tree). Náklady zde primárně zahrnují dvě komponenty: náklady na přístupu k indexovým stránkám a náklady na načtení odpovídajících stránek tabulky. Stránky indexu mají obecně vzory náhodného přístupu, protože uzly listů indexu nemusí být na disku fyzicky sousední, což vede k náhodným I/O operacím. Každý logický krok dolů stromem indexu od kořene k listům vyžaduje stránky čtení a tato cena se odhaduje pomocí náhodného parametru nákladů na stránku systému. Po nalezení položek indexu pro příslušné řádky načte systém odpovídající stránky dat tabulky. Počet takových načtených datových stránek závisí na selektivitě dotazu a fyzické korelaci mezi uloženými daty a pořadí indexu (známý jako korelace). Vysoká korelace znamená položky indexu řady řádků úzce odpovídají pořadí fyzických dat, snižují náhodné I/O a zefektivnily indexové skenování. Na druhé straně nízká korelace vede k mnoha náhodným načtením, což podstatně zvyšuje náklady na I/O.

Náklady na CPU při indexových skenování zahrnují zpracování každého jednotlivého načteného řádu, ale hlavní náklady jsou I/O. Existuje také aspekt viditelnosti: Pokud má databáze sledování mapy viditelnosti, které datové stránky jsou plně viditelné pro všechny transakce, může systém někdy zcela přeskočit čtení určitých stránek během skenování pouze pro index, což drasticky sníží náklady I/O.

Naproti tomu tabulka skenování nebo skenování úplné tabulky pracuje čtením všech datových stránek postupně z tabulky. I/O zde je většinou sekvenční, což má tendenci být rychlejší než náhodné I/O na spinningových discích nebo méně penalizovaných na SSD. Náklady na skenování celé tabulky jsou relativně konstantní, protože čte celou tabulku bez ohledu na počet řádků, které splňují dotaz. Tato cena závisí spíše na celkovém počtu stránek v tabulce než na počtu vybraných řádků. Úplné skenování tabulky nemá prospěch ze selektivity; Musí si přečíst každou stránku, i když dotaz silně filtruje řádky. S moderními technologiemi úložiště a optimalizací, jako jsou čtení s více bloky, paralelní čtení a vykládání úložných vrstvy, mohou být náklady na skenování plné tabulky konkurenceschopné nebo dokonce menší než indexové skenování pro dotazy, které získávají významnou část tabulky.

Optimalizátor založený na nákladech (CBO) se rozhoduje mezi použitím indexového skenování a úplným skenováním tabulky založené na odhadovaných nákladech. U vysoce selektivních dotazů, kde je třeba získat pouze malou část řádků, mají indexové skenování tendenci mít nižší I/O náklady, protože je načteno méně stránek stolů. Jak se prahová hodnota selektivity zvyšuje (více řádků), I/O náklady na indexové skenování stoupá v důsledku vyššího počtu náhodných načtených stránek a traverzů indexu, což nakonec překonává náklady na skenování celé tabulky. V tomto okamžiku CBO upřednostňuje skenování tabulky, protože sekvenční náklady na I/O jsou nižší než náhodná I/O zatížení mnoha vyhledávání indexu.

Dalším důležitým faktorem ovlivňujícím rozdíl v I/O je „faktor shlukování“ nebo fyzické shlukování řádků odpovídajících indexovým klíčům. Nižší faktor shlukování (lepší shlukování) znamená, že řádky přístupné prostřednictvím indexu jsou umístěny blízko sebe fyzicky, snižují náhodné I/O a zlepšují účinnost skenování indexu. Vyšší faktor shlukování vede k náhodnějšímu I/O během indexového skenování a snižuje jeho přínos ve srovnání s skenováním tabulky.

Moderní databázové systémy mohou také implementovat paralelní skenování, jak index, tak i plné skenování tabulky, kde jsou zdroje I/O a CPU sdíleny mezi více pracovníky, což může zkrátit celkovou dobu dotazu. Základní povaha I/O pro indexové skenování (náhodný přístup na stránku) versus skenování tabulky (většinou sekvenční přístup stránky) však zůstává klíčovým diferenciátorem.

Shrnout klíčové body o rozdílech v nákladech I/O:

- Indexové skenování způsobují I/O náklady z stránek čtení indexu (náhodný přístup) plus načtení odpovídajících datových stránek (potenciálně náhodný přístup). Náklady jsou citlivé na selektivitu, korelaci a faktor shlukování.
- Úplné skenování tabulky provádějí sekvenční I/O čtení všech stránek s relativně stabilními náklady na I/O bez ohledu na selektivitu.
- Skenování indexu může překonat, když dotazy zacílí na malé podmnožiny dat, ale s rostoucím selektivitou trpí náhodnými I/O režijními náklady.
- Plné skenování tabulek může být efektivnější, když velká část tabulky potřebuje přístup kvůli efektivnímu sekvenčnímu I/O.
- Mapy viditelnosti a skenování pouze pro index mohou v některých případech indexu snížit náklady I/O v některých případech indexového skenování tím, že se vyhýbáte čtení datové stránky.
- Paralelismus může zlepšit oba typy skenování, ale nemění základní I/O charakteristiky.
- Optimalizátor vyrovnává tyto nákladové faktory, aby si vybrali nejúčinnější metodu založenou na dotazovacích a datových charakteristikách.

Toto vysvětlení zachycuje rozdíly v jednotlivých nákladech v I/O operacích mezi indexovými skenováními a skenováním tabulek, jak je pochopeno v moderních relačních databázových systémech.