Az indexek és a táblázatok elvégzésének két alapvető megközelítése az adatbázisban az adatok eléréséhez, mindegyik megkülönböztetett kompromisszumokkal, a helyzettől függően.
Az adatbázisban található index egy olyan adatszerkezet, amely lehetővé teszi a gyorsabb keresést, lehetővé téve a rendszer számára, hogy a sorok gyors megkeresésében legyen, anélkül, hogy a táblázat minden sorát beolvasnák. A legtöbb relációs adatbázis a B+ faszerkezeteket használja az indexekhez, amelyek kulccsal és mutatókat fák formájában szerveznek. Ez lehetővé teszi a $$ o (\ log n) $ $ logaritmikus idő komplexitásának keresése, beillesztéseit és deléciókat, ami általában sokkal gyorsabb, mint a teljes táblázat szkennelése $$ o (n) $ $ komplexitással. Az indexek csoportosíthatók vagy nem füstölhetők, a csoportosított indexekkel, amelyek az adatokat fizikailag rendezett sorrendben tárolják, javítva a tartomány-szkennelési teljesítményt az adatok módosításakor extra általános költségek árán. Az indexek kompozit, részleges, szűrt vagy hash-alapú, meghatározott lekérdezési mintákra is beállíthatók.
Ezzel szemben egy táblázatkapcs (vagy teljes asztali vizsgálat) a táblázat minden sorát egymás után olvassa el, függetlenül a lekérdezés szelektivitásától. Ez magában foglalja a táblázat összes adatblokkjának beolvasását, és gyakran a legdrágább hozzáférési módszernek tekintik, mivel a szükségesnél több adatot dolgozik fel. Az asztali vizsgálat azonban bizonyos esetekben jól teljesíthet. Például, amikor a lekérdezések nagy százalékot szereznek be, akkor az index (amely gyakran további kereséseket igényel a tényleges sorok további keresésére), meghaladhatja a teljes táblázat egyszeri szkennelésének költségeit. A táblázatok szkennelése több blokkolási leolvasást használhat, amelyek lehetővé teszik a kevesebb I/O művelettel rendelkező nagy adatrészek elolvasását, ezáltal csökkentve a késleltetést, összehasonlítva az index-szkennelések által véletlenszerűen megkövetelt sok blokk elolvasásával.
Az egyik fő kompromisszum magában foglalja a lekérdezés által visszaadott adatkészlet szelektivitását és méretét. Ha a lekérdezés kis számú sorra szűrődik (nagy szelektivitás), az indexek általában felülmúlják a táblázatok vizsgálatát, mivel csak a vonatkozó adatokhoz kell hozzáférniük. Ahogy a visszaadott sorok százalékos aránya növekszik, az index -szkennelések költsége növekszik, mivel több kulcsfontosságú keresésre lehet szükség, és az adatbázis -motornak további véletlenszerű I/O műveleteket kell végrehajtania. Néhány küszöbértéknél a táblázat sorának gyakran 10-20% -a, de az adatszélességtől és a hardvertől függően a teljes asztali vizsgálat hatékonyabbá válik. Ennek oka az, hogy a letapogatási költségek a szelektivitástól függetlenül állandóak, egyszerűen egyszer olvassák el a táblázatot.
Az index -szkennelések általában kevesebb oldalt olvasnak, mint egy asztali szkennelés, ha a fedett oszlopok kevesebb vagy kompaktabbak, mint a teljes asztali sorok. Például egy index csak az indexelt oszlopokat tartalmazhatja, a teljes táblázat soros adatainak nélkül, így vékonyabbá teszi, és lehetővé teszi, hogy több sor illeszkedjen az egyes adatbázisok oldalán. Ez csökkenti az I/O általános költségeket az index beolvasásakor, összehasonlítva a teljes táblázat adatainak beolvasásával. Ezenkívül egyes indexek szűrhetők (részleges indexek) a irreleváns sorok kizárására, tovább csökkentve a szkennelési lábnyomot.
Másrészt a teljes asztali vizsgálat kevesebb terhet ír az adatbázis karbantartási oldalán. Az indexek bevezetik az általános költségeket az adatmódosítási műveletek során, például a beszúrás, a frissítés és a törlés során. A táblázat minden változása megköveteli az indexek frissítését, néha megnövekedett írási késéssel és tárolással, különösen akkor, ha sok index létezik az asztalon. Ez a költségek befolyásolhatják a párhuzamosságot is, és vitatáshoz vezethetnek a nehéz írási környezetben. Így a táblázatok, amelyek egyszerűen elolvasják az adatokat természetes sorrendben, további szerkezeti karbantartás nélkül, elkerülik ezt a költséget.
Egy másik fontos szempont a gyorsítótárazás és a hardverjellemzők hatása. A táblázatok szkennelése előnyös a szekvenciális I/O -ból és az előkészítésből, lehetővé téve a rendszer számára, hogy hatékonyan olvassa el a több szomszédos blokkot, gyakran a memóriából, ha gyorsítótárba kerül. Ezzel szemben az index -szkennelések véletlenszerű I/O -t tartalmaznak az eltérő adatblokkok lekérésére, különösen akkor, ha az index -szkennelésnek meg kell keresnie a sor mutatóit a halom tárolóba. Ez az index -szkenneléseket lassabbá teheti a lassabb lemez véletlenszerű I/O teljesítményű rendszereken, bár az SSD -k és a nagy memória medencék szűkítik ezt a rést. A helyzet függhet olyan specifikumoktól is, mint a párhuzamosság és az adatbázis-motor többszálú képességei, ahol a párhuzamos asztali vizsgálat jelentősen növelheti az átviteli sebességet.
Ezenkívül a belső fragmentáció és a fizikai tárolási elrendezés befolyásolja a teljesítmény kompromisszumait. A halom-szervezett asztalok asztali vizsgálata továbbíthatja a továbbított nyilvántartásokat, ahol a sorok különböző oldalakra költöztek a frissítések miatt, a szkennelés hatékonyságának romlása miatt. A csoportosított indexek, amelyek a Key által rendelt adatokat tárolják, elkerülhetik ezt a problémát, és néha a "Táblázat -letapogatás" -ot egyenértékűvé teszik egy fürtözött index -szkenneléssel. Az előnyök azonban a drága sorok átrendezésének költségeivel járnak a nehéz adatgyűjtés során.
A lekérdezés-optimalizáló szempontból az index-szkennelés és a táblázatkaputatás közötti döntést általában költség-alapú becslési modellek végzik, figyelembe véve az adateloszlás, a sorszámok és a hardver költségeiről szóló statisztikákat. Az optimalizáló kiegyensúlyozza a CPU, I/O és a memória költségeit a leghatékonyabb hozzáférési út kiválasztásához. Ezeket a döntéseket olyan tényezők befolyásolhatják, mint a rendelkezésre álló memória, a gyorsítótárazási állapot és a lekérdezési minták. Nincs rögzített küszöb az egyik vagy a másik használata között; A keresztezési pont rendszerenként és munkaterhelésenként változik.
Összefoglalva: az indexek és a táblázatok használata közötti kompromisszumok a következőket tartalmazzák:
- Teljesítmény vs. adatmennyiség: Az indexek felülmúlnak, ha néhány sorra szűrik; Az asztali vizsgálat jobb lehet a nagy adatkereséshez.
- I/O minták: Az index -vizsgálat véletlenszerű I/O olvasmányokat okoz; A táblázatok szkennelése előnyös a szekvenciális I/O és a Multi Block Reads részéről.
- Karbantartási költségek: Az indexek növelik az írási működési költségeket az indexszerkezetek frissítései miatt; Az asztali vizsgálat nem végez ezt.
- Tárolási hatékonyság: Az indexek kompakt lehetnek, ha kevesebb oszlopot fednek le; A táblázatok beolvasása feldolgozza a teljes sorokat és potenciálisan több adatot.
- Gyorsítótárazási effektusok: A táblázatok vizsgálata hatékonyan használhatja az adatgyűjtést, különösen a nagy szekvenciális leolvasások esetén; Lehet, hogy az index -szkennelések nem részesülnek annyira a véletlenszerű hozzáférés miatt.
- Optimalizáló döntés: Költség-alapú lekérdezés Az optimalizálók dinamikusan választanak ezen opciók között a lekérdezési statisztikák és a munkaterhelés-specifikumok alapján.
- Az adatok elrendezésének hatása: A halomtáblák szankciókat okozhatnak, mint a továbbított nyilvántartások a szkennelés során; A csoportosított indexek fizikailag szervezik az adatokat, de növelik a frissítési költségeket.