Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Aké sú kompromisy medzi používaním indexov a skenovania tabuľky


Aké sú kompromisy medzi používaním indexov a skenovania tabuľky


Použitie indexov a vykonávanie skenov tabuľky sú dva základné prístupy k prístupu k údajom v databáze, z ktorých každý má odlišné kompromisy v závislosti od situácie.

Index v databáze je dátová štruktúra, ktorá umožňuje rýchlejšie vyhľadávanie tým, že umožňuje systému rýchlo lokalizovať riadky bez skenovania každého riadku v tabuľke. Väčšina relačných databáz používa B+ stromové štruktúry pre indexy, ktoré organizujú kľúče a ukazovatele vo forme stromu. To umožňuje vyhľadávania, inzercie a delécie v zložitosti logaritmického času $$ O (\ log n) $$, čo je zvyčajne oveľa rýchlejšie ako skenovanie celej tabuľky so zložitosťou $$ O (n) $$. Indexy môžu byť zoskupené alebo nezosluhované, pričom zoskupené indexy ukladajú údaje vo fyzicky zoradenom poradí, čím sa zlepší výkon skenovania rozsahu za cenu extra režijných nákladov na úpravy údajov. Indexy môžu byť tiež zložené, čiastočné, filtrované alebo založené na hashu, vyladené na špecifické vzory dotazov.

Naopak, skenovanie tabuľky (alebo úplné skenovanie tabuľky) číta každý riadok v tabuľke postupne, bez ohľadu na selektivitu dotazu. Zahŕňa to skenovanie všetkých dátových blokov tabuľky a často sa považuje za najdrahšiu metódu prístupu, pretože spracováva viac údajov, ako je potrebné. V niektorých prípadoch sa však skenovanie tabuľky môže dobre fungovať. Napríklad, keď dotazy získavajú veľké percento riadkov, režijné náklady na používanie indexu (ktoré si často vyžaduje ďalšie vyhľadávanie pre skutočné riadky) môže prekročiť náklady na skenovanie celej tabuľky raz. Skenovanie tabuľky môžu využiť viacblokové čítania, ktoré umožňujú čítanie veľkých kúskov údajov s menším počtom I/O operácií, čím sa znižuje latencia v porovnaní s čítaním mnohých jednotlivých blokov náhodne požadovaných pomocou indexových skenov.

Jeden hlavný kompromis zahŕňa selektivitu a veľkosť súboru údajov vrátených dotazom. Ak sa dotaz filtruje na malý počet riadkov (vysoká selektivita), indexy vo všeobecnosti prekonávajú skenovanie tabuľky, pretože potrebujú prístup iba k príslušným údajom. Ale ako sa percento vrátených riadkov zvyšuje, môže sa vyžadovať náklady na snímanie indexu, pretože sa môže vyžadovať viac kľúčových vyhľadávaní a databázový motor musí vykonávať ďalšie náhodné I/O operácie. Pri určitej prahovej hodnote, často okolo 10-20% riadkov tabuľky, ale závisí od šírky údajov a hardvéru, sa skenovanie úplného tabuľky stáva efektívnejším. Dôvodom je skutočnosť, že náklady na skenovanie zostávajú konštantné bez ohľadu na selektivitu, jednoducho čítať tabuľku postupne raz.

Indexové skenovanie zvyčajne čítajú menej stránok ako skenovanie tabuľky, keď sú kryté stĺpce menšie alebo kompaktnejšie ako riadky s plnou tabuľkou. Napríklad index môže obsahovať iba indexované stĺpce bez úplných údajov o riadkoch tabuľky, vďaka čomu je tenší a umožní viac riadkov, ktoré sa zmestia na každú stránku databázy. To znižuje režijné náklady I/O pri skenovaní indexu v porovnaní s skenovaním celých údajov tabuľky. Niektoré indexy sa navyše môžu filtrovať (čiastočné indexy), aby sa vylúčili irelevantné riadky, čím sa ďalej znižuje skenovacia stopa.

Na druhej strane skenovanie úplného tabuľky píšu menej záťaž na strane údržby databázy. Indexy zavádzajú režijné náklady počas operácií modifikácie údajov, ako sú vkladanie, aktualizácia a odstránenie. Každá zmena v tabuľke vyžaduje aktualizáciu indexov, čo niekedy vedie k zvýšenej latencii zápisu a režijným nákladom na ukladanie, najmä ak existuje veľa indexov v tabuľke. Táto réžia môže tiež ovplyvniť súbežnosť a viesť k tvrdeniu v prostredí ťažkých zápisov. Skenovanie tabuľky, ktoré jednoducho čítajú údaje v jej prirodzenom poradí bez dodatočnej údržby štruktúry, sa týmto nákladom vyhýbajú.

Ďalším dôležitým faktorom je účinok charakteristík ukladania do vyrovnávacej pamäte a hardvéru. Skenovanie tabuľky majú úžitok zo sekvenčných I/O a predbežného načítania, čo umožňuje systému efektívne čítať viac susedných blokov, často z pamäte, ak sú uložené uložené. Naopak, indexové skenovanie vznikajú náhodné I/O na načítanie rôznych dátových blokov, najmä ak musí sken indexu vyhľadať ukazovatele riadkov do úložiska haldy. To môže spôsobiť, že index skenuje pomalšie v systémoch s pomalším diskom náhodným výkonom I/O, hoci SSD a veľké pamäťové bazény túto medzeru zúžia. Situácia môže tiež závisieť od špecifiká, ako je paralelizmus a schopnosti viacerých vlákien databázového motora, kde paralelné skenovanie tabuľky môžu výrazne zvýšiť priepustnosť.

Okrem toho ovplyvňujú interné fragmentácie a usporiadanie fyzického skladovania kompromisy. Skenovanie tabuľky na tabuľkách organizovaných haldy môžu trpieť preposlanými záznamami, kde sa riadky presunuli na rôzne stránky v dôsledku aktualizácií, zhoršujúcej sa účinnosť skenovania. Zhlukované indexy, ktoré ukladajú údaje zoradené podľa Key, sa môžu vyhnúť tomuto problému a niekedy urobiť „skenovanie tabuľky“ ekvivalentu zoskupeného skenovania indexu. Výhody však prichádzajú s nákladmi na drahé riadiace poradie počas ťažkých údajov.

Z hľadiska optimalizátora dotazov sa rozhodnutie medzi skenovaním indexu a skenom tabuľky zvyčajne vykonáva pomocou modelov odhadu založených na nákladoch, pričom sa zohľadňuje štatistika distribúcie údajov, počet riadkov a náklady na hardvér. Optimalizátor vyrovnáva náklady CPU, I/O a pamäte, aby si vybrali najúčinnejšiu cestu prístupu. Tieto rozhodnutia môžu byť ovplyvnené faktormi, ako je dostupná pamäť, stav ukladania do vyrovnávacej pamäte a vzorce dotazov. Neexistuje žiadna pevná prahová hodnota medzi tým, kedy použiť jeden alebo druhý; Crossover Bod sa líši v rámci systému a pracovné zaťaženie.

Súhrnne možno povedať, že kompromisy medzi použitím indexov a tabuľkovými skenmi zahŕňajú:

- Performance vs. Objem údajov: indexy prekonávajú pri filtrovaní do niekoľkých riadkov; Skenovanie tabuľky môžu byť lepšie pre získavanie veľkých údajov.
- Vzory I/O: Indexové skenovanie spôsobujú náhodné I/O čítanie; Skenovanie tabuľky majú úžitok zo sekvenčných I/O a viacblokových čítaní.
- Režijné náklady na údržbu: Indexy zvyšujú zápisové prevádzkové náklady v dôsledku aktualizácií indexových štruktúr; Tabuľka to nevznikajú.
- Účinnosť úložiska: Indexy môžu byť kompaktné pokrytím menšieho množstva stĺpcov; Tabuľka skenuje proces úplných riadkov a potenciálne viac údajov.
- Účinky ukladania do vyrovnávacej pamäte: Skenovanie tabuľky môžu efektívne využívať ukladanie do vyrovnávacej pamäte údajov, najmä s veľkými sekvenčnými hodnotami; Indexové skeny nemusia mať úžitok z dôvodu náhodného prístupu.
- Optimalizátor: Optimizátory dotazov založené na nákladoch dynamicky vyberte medzi týmito možnosťami na základe štatistík dotazov a špecifiká pracovnej záťaže.
- Vplyv rozloženia údajov: Tabuľky hromady môžu počas skenov vzniknúť pokuty, ako sú preposielané záznamy; Zhlukované indexy organizujú údaje fyzicky, ale zvyšujú náklady na aktualizáciu.

Pre efektívny návrh databázy a optimalizácia dopytu je rozhodujúca kombinácia starostlivej stratégie indexovania a povedomia o tom, kedy sú skenovanie tabuľky prijateľné alebo výhodnejšie. Indexy sú výkonné nástroje urýchľujúce veľa dotazov, ale za náklady na ukladanie a zapisovanie výkonu. Stolové skenovanie, hoci zdanlivo brutálna sila, zostávajú dôležité pre operácie, ktoré získavajú veľké časti údajov alebo keď je pokrytie indexu nízke. Pochopenie nuancií za týmito mechanizmami umožňuje lepšie ladenie a škálovanie databázových systémov.