Použití indexů a provádění skenování tabulek jsou dva základní přístupy k přístupu k datům v databázi, z nichž každá má odlišné kompromisy v závislosti na situaci.
Index v databázi je struktura dat, která umožňuje rychlejší vyhledávání tím, že umožňuje systému rychle najít řádky bez skenování každého řádku v tabulce. Většina relačních databází používá B+ stromové struktury pro indexy, které organizují klíče a ukazatele ve formě stromu. To umožňuje vyhledávání, inzerce a odstranění v logaritmické složitosti času $$ o (\ log n) $$, což je obvykle mnohem rychlejší než skenování celé tabulky se složitostí $$ O (n) $$. Indexy mohou být seskupeny nebo netastovány, se shlukovanými indexy ukládají data ve fyzicky tříděném pořadí, což zlepšuje výkon skenování dosahu za cenu další režie při úpravách dat. Indexy mohou být také kompozitní, částečné, filtrované nebo hashové naladěné pro specifické vzorce dotazů.
Naproti tomu skenování tabulky (nebo skenování celé tabulky) čte každý řádek v tabulce, bez ohledu na selektivitu dotazu. To zahrnuje skenování všech datových bloků tabulky a je často považováno za nejdražší metodu přístupu, protože zpracovává více dat, než je nutné. V některých případech však mohou dobře fungovat skenování tabulek. Například, když dotazy načítají velké procento řádků, může režie používání indexu (který často vyžaduje další vyhledávání pro skutečné řádky) může překročit náklady na skenování celé tabulky jednou. Skenování tabulek může využít více blokovací čtení, které umožňují čtení velkých kousků dat s menším počtem I/O operací, čímž se snižuje latenci ve srovnání se čtením mnoha jednotlivých bloků náhodně vyžadovaných indexovým skenováním.
Jeden hlavní kompromis zahrnuje selektivitu a velikost sady dat vráceného dotazem. Pokud se dotaz filtruje na malý počet řádků (vysoká selektivita), indexy obecně překonávají skenování tabulky, protože potřebují přístup pouze k příslušným datům. S rostoucím procentem vrácených řádků se však zvyšuje náklady na skenování indexu, protože mohou být vyžadovány více klíčových vyhledávání a databázový motor musí provádět další náhodné operace I/O. Při určitém prahu, často kolem 10-20% řad tabulky, ale závislých na šířce dat a hardwaru, je úplné skenování tabulky efektivnější. Je to proto, že náklady na skenování zůstávají konstantní bez ohledu na selektivitu, jednoduše přečtení tabulky jednou postupně.
Indexové skenování obvykle čte méně stránek než skenování tabulky, když jsou kryté sloupce méně nebo více kompaktní než řady celé tabulky. Například index může zahrnovat pouze indexované sloupce bez údajů o řadě tabulky, což způsobí, že je tenčí a umožňuje více řádků na každou stránku databáze. To snižuje režii I/O při skenování indexu ve srovnání se skenováním všech dat tabulky. Kromě toho mohou být některé indexy filtrovány (částečné indexy), aby se vyloučily irelevantní řádky, což dále snižuje skenovací stopu.
Na druhé straně skenování plného stolu píše menší zátěž na straně údržby databáze. Indexy zavádějí režii během operací modifikace dat, jako je vkládání, aktualizace a odstranění. Každá změna v tabulce vyžaduje aktualizační indexy, někdy vede ke zvýšení latence zápisu a režii úložiště, zejména pokud v tabulce existuje mnoho indexů. Tato režie může také ovlivnit souběžnost a vést k tvrzení v prostředích těžkých zápisů. Skenování tabulek, které jednoduše čte data v jeho přirozeném pořadí bez další údržby struktury, se tedy těmto náklady vyhněte.
Dalším důležitým hlediskem je účinek charakteristik ukládání do mezipaměti a hardwaru. Skeny tabulek těží ze sekvenčního I/O a předběžného načítání, což umožňuje systému efektivně číst více sousedních bloků, často z paměti, pokud je uložena. Naopak indexové skenování způsobují náhodné I/O k načtení nesourodých datových bloků, zejména pokud indexový skenování musí vyhledat ukazatele řádků do úložiště haldy. To může index skenovat pomaleji na systémech s pomalejším diskem náhodným I/O výkonem, ačkoli SSD a velké paměťové fondy tuto mezeru zúží. Situace může také záviset na specifikách, jako je paralelismus a schopnosti více vládnutí databázového motoru, kde paralelní skenování tabulky může výrazně zvýšit propustnost.
Navíc interní rozložení a rozvržení fyzického úložiště ovlivňuje kompromisy výkonu. Skenování tabulek na tabulkách s organizovanými haldami by mohlo trpět předanými záznamy, kde se řádky přesunuly na různé stránky kvůli aktualizacím, což zhoršilo účinnost skenování. Shlukované indexy, které ukládají data tříděná podle klíče, se mohou tomuto problému vyhnout a někdy vytvořit „skenování tabulky“ ekvivalentní seskupenému indexovému skenování. Výhody však přicházejí s náklady na drahé uspořádání řádků během těžkých dat.
Z pohledu optimalizátoru dotazů je rozhodnutí mezi indexovým skenováním a skenováním tabulky obvykle prováděno podle modelů odhadu založeného na nákladech, přičemž se zohledňuje statistika distribuce dat, počtu řádků a hardwarových nákladech. Optimalizátor vyvažuje náklady na CPU, I/O a paměť a vybere nejúčinnější přístup k přístupu. Tato rozhodnutí mohou být ovlivněna faktory, jako je dostupná paměť, stav ukládání do mezipaměti a vzory dotazů. Neexistuje žádný pevný práh mezi tím, kdy použít jeden nebo druhý; Bod crossover se mění na systém a pracovní vytížení.
Stručně řečeno, kompromisy mezi používáním indexů a skenování tabulek zahrnují:
- Výkon vs. Objem dat: Indexy překonávají při filtrování na několik řádků; Skenování tabulek může být lepší pro velké získávání dat.
- I/O vzory: Skenování indexu způsobuje náhodné čtení I/O; Skenování tabulek těží ze sekvenčních I/O a multi-block čtení.
- Režie údržby: Indexy zvyšují náklad na zápis v důsledku aktualizací indexových struktur; Skenování tabulek to nevyvolává.
- Účinnost úložiště: Indexy mohou být kompaktní pokrytím méně sloupců; Skenování tabulky zpracovává plné řady a potenciálně více dat.
- efekty ukládání do mezipaměti: Skenování tabulek může efektivně využívat ukládání dat, zejména s velkými sekvenčními čteními; Skeny indexu nemusí mít prospěch tolik kvůli náhodnému přístupu.
- Optimalizátor rozhodnutí: Optimalizátory dotazů založené na nákladech Dynamicky vybírají mezi těmito možnostmi na základě statistik dotazů a specifik pracovního vytížení.
- Dopad rozložení dat: Tabulky haldy mohou během skenování způsobit pokuty, jako jsou předávané záznamy; Shlukované indexy organizují data fyzicky, ale zvyšují náklady na aktualizaci.