Rodyklės ir atlikimo lentelių nuskaitymai yra du pagrindiniai metodai, kaip pasiekti duomenis duomenų bazėje, kiekvienas turi skirtingus kompromisus, atsižvelgiant į situaciją.
Duomenų bazės rodyklė yra duomenų struktūra, leidžianti greičiau paieškoti, leidžiant sistemai greitai surasti eilutes nenuskaitydama kiekvienos lentelės eilutės. Daugelyje reliacinių duomenų bazių rodyklėms naudojamos B+ medžių struktūros, kurios organizuoja raktus ir rodykles medžio forma. Tai leidžia paieškoms, įterpimams ir delecijoms ištraukti logaritminiu laiko sudėtingumu $ $ O (\ log n) $$, kuris paprastai yra daug greitesnis, nei nuskaityti visą lentelę, sudėtingu $ $ o (n) $ $. Rodykles galima sugrupuoti arba nesiryžti, nes grupiniai indeksai saugo duomenis fiziškai rūšiuojama tvarka, pagerinant diapazono nuskaitymo našumą ir papildomai pridėtines duomenis apie duomenų modifikacijas. Rodyklės taip pat gali būti sudėtinės, dalinės, filtruojamos ar maišos pagrindu sukurtos pagal konkrečius užklausų modelius.
Priešingai, lentelės nuskaitymas (arba visos lentelės nuskaitymas) nuskaito kiekvieną lentelės eilutę nuosekliai, nepaisant užklausos selektyvumo. Tai apima visus lentelės duomenų blokus ir dažnai laikomas brangiausiu prieigos metodu, nes jis apdoroja daugiau duomenų, nei būtina. Tačiau tam tikrais atvejais lentelių nuskaitymai gali būti gerai. Pvz., Kai užklausos gauna didelę dalį eilučių, pridėtinė vertė, naudojant rodyklę (kuriai dažnai reikia papildomų realių eilučių paieškos), gali viršyti visos lentelės nuskaitymo išlaidas vieną kartą. Lentelės nuskaitymai gali naudoti daugialypius skaitymus, kurie leidžia skaityti didelius duomenų dalis su mažiau I/O operacijų, taip sumažinant latenciją, palyginti su daugelio atskirų blokų, atsitiktinai reikalaujamų atliekant indekso nuskaitymus, skaitymas.
Vienas pagrindinis kompromisas apima duomenų rinkinio, kurį grąžina užklausa, selektyvumas ir dydis. Jei užklausa filtruoja iki nedidelio skaičiaus eilučių (didelis selektyvumas), indeksai paprastai pralenkia lentelės nuskaitymus, nes jiems reikia tik pasiekti atitinkamus duomenis. Tačiau didėjant eilučių procentui, indekso nuskaitymų kaina padidėja, nes gali prireikti kelių pagrindinių paieškų, o duomenų bazės variklis turi atlikti papildomas atsitiktines I/O operacijas. Esant tam tikram slenksčiui, dažnai apie 10–20% lentelės eilučių, tačiau priklausomai nuo duomenų pločio ir aparatinės įrangos, visas lentelės nuskaitymas tampa efektyvesnis. Taip yra todėl, kad nuskaitymo išlaidos išlieka pastovios, neatsižvelgiant į selektyvumą, tiesiog vieną kartą skaityti lentelę.
Rodyklės nuskaitymai paprastai nuskaito mažiau puslapių nei lentelės nuskaitymas, kai uždengti stulpeliai yra mažiau kompaktiški nei visos lentelės eilutės. Pavyzdžiui, rodyklėje gali būti tik indeksuoti stulpeliai be visų lentelės eilučių duomenų, todėl jis tampa plonesnis ir leisdamas daugiau eilučių tilpti į kiekvieną duomenų bazės puslapį. Tai sumažina I/O pridėtinę vertę nuskaitydama rodyklę, palyginti su visų lentelės duomenų nuskaitymu. Be to, kai kuriuos indeksus galima filtruoti (daliniai indeksai), kad būtų pašalintos nereikšmingos eilutės, dar labiau sumažinant nuskaitymo pėdsaką.
Kita vertus, visos lentelės nuskaitymai duomenų bazės priežiūros pusėje užrašo mažiau naštos. Rodyklės pristato pridėtines duomenis apie duomenų modifikavimo operacijas, tokias kaip įterpimas, atnaujinimas ir ištrinimas. Kiekvienam lentelės pakeitimui reikia atnaujinti rodykles, kartais dėl to padidinus rašymo delsos ir saugyklos pridėtines išlaidas, ypač jei ant stalo egzistuoja daugybė rodyklių. Ši pridėtinė vertė taip pat gali paveikti suderinamumą ir sukelti ginčą sunkioje rašymo aplinkoje. Taigi lentelės nuskaitymai, kurie tiesiog skaito duomenis natūralia tvarka be papildomos struktūros priežiūros, išvengkite šių išlaidų.
Kitas svarbus aspektas yra talpyklos ir aparatūros charakteristikų poveikis. Lentelės nuskaitymai yra naudingi nuosekliam I/O ir išankstiniam kėlimui, leidžiant sistemai efektyviai, dažnai iš atminties skaityti kelis gretimus blokus, dažnai iš atminties. Ir atvirkščiai, indekso nuskaitymai patiria atsitiktinį I/O, kad būtų galima gauti skirtingus duomenų blokus, ypač jei indekso nuskaitymas turi ieškoti eilutės rodyklės į krūvos saugyklą. Tai gali padaryti indekso nuskaitymą lėtesnėmis sistemomis, turinčiomis lėtesnį disko atsitiktinį I/O našumą, nors SSD ir dideli atminties telkiniai susiaurina šią spragą. Padėtis taip pat gali priklausyti nuo tokios specifikos kaip paralelizmas ir duomenų bazės variklio daugialypės galimybės, kuriose lygiagrečiai lentelės nuskaitymai gali žymiai padidinti pralaidumą.
Be to, vidinis suskaidymas ir fizinio saugojimo išdėstymas daro įtaką našumo kompromisams. Lentelių nuskaitymai ant krūvos organizuotų lentelių gali nukentėti nuo perduotų įrašų, kur eilutės persikėlė į skirtingus puslapius dėl atnaujinimų, pablogėjusio nuskaitymo efektyvumo. Klasteriniai indeksai, kurie saugo duomenis, rūšiuojamus pagal raktą, gali išvengti šios problemos ir kartais padaryti „lentelės nuskaitymą“, lygiavertį klasifikuotam indekso nuskaitymui. Tačiau pranašumai yra brangūs eilučių pertvarkymo išlaidos sunkių duomenų kumšteliuose.
Žvelgiant iš užklausos optimizavimo priemonės, sprendimas tarp rodyklės nuskaitymo ir lentelės nuskaitymo paprastai priimamas pagal sąnaudas pagrįstus įvertinimo modelius, atsižvelgiant į duomenų paskirstymo, eilučių skaičiaus ir aparatinės įrangos išlaidų statistiką. Optimizatorius subalansuoja CPU, I/O ir atminties išlaidas, kad pasirinktų efektyviausią prieigos kelią. Šiems sprendimams gali įtakoti tokie veiksniai kaip turima atmintis, talpyklos talpyklos būsena ir užklausų modeliai. Nėra fiksuotos slenksčio tarp kada naudoti vieną ar kitą; Kryžminio taškas skiriasi kiekvienai sistemai ir darbo krūviui.
Apibendrinant galima pasakyti, kad kompromisai tarp indeksų ir lentelių nuskaitymų apima:
- Našumas ir duomenų apimtis: Rodyklės pralenkia filtruojant iki kelių eilučių; Lentelių nuskaitymai gali būti geresni dideliam duomenų gavimui.
- I/O modeliai: indekso nuskaitymai sukelia atsitiktinius I/O skaitymus; Lentelės nuskaitymai naudingi nuosekliems I/O ir daugialypiams blokams.
- Priežiūros pridėtinės išlaidos: rodyklės padidina rašymo veiklos išlaidas dėl indekso struktūrų atnaujinimų; Lentelės nuskaitymai to nedaro.
- Sandėliavimo efektyvumas: indeksai gali būti kompaktiški, uždengiant mažiau stulpelių; Lentelės nuskaitymai apdoroja visas eilutes ir galbūt daugiau duomenų.
- talpyklos padarinių efektai: lentelės nuskaitymai gali efektyviai naudoti duomenų talpyklą, ypač turint didelius nuoseklius skaitymus; Rodyklės nuskaitymai gali būti naudingi ne tiek dėl atsitiktinės prieigos.
- Optimizavimo priemonės sprendimas: Kainomis pagrįsti užklausų optimizatoriai Dinamiškai Pasirinkite šias parinktis pagal užklausų statistiką ir darbo krūvio specifiką.
- Duomenų išdėstymo poveikis: krūvos lentelėse gali būti skiriamos baudos, tokios kaip persiųsti įrašai nuskaitymo metu; Klasteriniai indeksai organizuoja duomenis fiziškai, tačiau padidina atnaujinimo sąnaudas.