C# - Index létrehozása PL/SQL-ben

Oracle adatbázis-kezelés 12. rész

forráskód letöltése
A relációs adatbázisok elvének megfelelően az Oracle-rendszer is lehetővé teszi, hogy indexeket hozzunk létre egy adattábla bizonyos oszlopaira. Cikksorozatunk mai számában bemutatjuk, hogyan lehet ezt megtenni a PL/SQL nyelv segítségével, bemutatva az SQL-parancs általános szintaxisát. A cikk mellékletében közölt példaprogramban kiderítjük, hogy időben mekkora a különbség két SQL-lekérdezés között indexszel rendelkező, illetve nem rendelkező, tartalmukban azonos táblák esetében.
A példaprogram használata előtt létre kell hozni egy SOUSER sémát az Oracle adatbázis-rendszerünkben, és fel kell ruházni DBA jogosultsággal. A sémába bejelentkezve le kell viszont futtatni a mellékelt Oracle12.sql nevű parancsállományt a hivatkozott további objektumok létrehozásához.
Ahogy más adatbáziskezelő rendszerekben, az Oracle rendszerben is van lehetőségünk bizonyos keresések hatékonyságát az adott táblában deklarált indexekkel növelni. Az indexek használatának vannak bizonyos előnyei, melyek miatt nagy rekordszámú táblákban elengedhetetlen a használatuk:
  • az oszlopok végigpásztázásának felgyorsítása
  • oszlopok egyediségének kikényszerítése
  • sorok bizonyos sorrendben való megjelenítése.
Az Oracle rendszer – hacsak nem utasítjuk az ellenkezőjére az index elkészítésekor – B-fa indexekkel dolgozik. A B-fa index kifejezés arra utal, hogy milyen matematikai elven tárolódik az információ, és ezt milyen módszerrel pásztázza végéig az utasítás feldolgozó.
A B-fa elvet úgy érthetjük meg, ha elképzelünk egy fa-struktúrát, ahol a gyökérblokk (root) elágazik, és minden ágnak vannak elágazásai. Ezek az ágblokkok (decision node). A fa-szerkezet legmélyebb pontján olyan elemek vannak, melyek már nem ágaznak tovább, ők a levélblokkok (leaf). Minden objektum egy bizonyos körét tartalmazza a táblában lévő adatoknak, a gyökérblokk tartalmaz egy mutatót az összes, belőle elágazó objektum adatcsoportjára. A kereséskor a gyökérblokk meghatározza, hogy mely elágazásában található a keresett információ. Az elágazó objektum szintén rendelkezik mutatókkal a belőle ágazó objektumok adathalmazaira. A keresőmotor addig halad lefelé a levelekig, amíg meg nem találja a keresett információt.
Az Oracle 7-es verziójától kezdődően úgynevezett költség alapú optimalizálót építettek az alkalmazásba. Ennek lényege, hogy kereséskor a feldolgozó a rendelkezésre álló, időközönként frissítendő rendszerstatisztikákat is figyelembe veszi, a legkisebb költségráfordítás alapján működik (IO műveletek száma, blokkok száma).
Az ilyen statisztikák elkészítésére a rendszer az ANALYSE parancs kiadásával manuálisan is kényszeríthető.
A PL/SQL-ben a következő szintaxissal lehet indexeket létrehozni:
CREATE [{UNIQUE | BITMAP}] INDEX <index neve>
ON {táblanév (oszlop [ASC | DESC], oszlop [ASC | DESC])}
Az indexek létrehozásához a tábla tulajdonosának kell lennünk, rendelkeznünk kell a táblára vonatkozó INDEX privilégiummal, vagy a CREATE ANY INDEX rendszerprivilégiummal.
A UNIQUE kulcsszó jelzi, hogy az oszlopnak (vagy oszlop kombinációnak), mellyel a tábla indexelése történik, egyedinek kell lennie.
A BITMAP kulcsszóval jelezhetjük a feldolgozónak, hogy B-fa index helyett BITMAP-indexet készítsen.
Az ASC, és DESC kulcsszavak csak a DB2 rendszerrel való kompatibilitás céljából maradtak meg, az index létrehozása mindig növekvő sorrendben történik.
A mellékelt példában, az Oracle12.sql parancsállomány lefuttatása után két tábla került az adatbázis SOUSER sémájába. A két tábla azonos szerkezettel és tartalommal rendelkezik. A táblák feltöltése a program indítása után történik a ’Feltöltés’ gombra kattintva. Amennyiben a program indításakor a táblák már rendelkeznek a szükséges rekordszámmal, akkor a feltöltés nyomógombja nem használható.
A táblák között csak az a különbség, hogy a Table1 táblára egy indexet deklaráltunk, mely a három oszlopát tartalmazza. A Table2 tábla nem rendelkezik indexszel. Az index létrehozása a következőképpen történt:
CREATE INDEX sample_index ON Table1(COL1,COL2,COL3)
A műveleti gombra kattintva két API metódus segítségével megmérhetjük, hogy melyik esetben gyorsabb a keresés az adott táblában. A mérést több esetben végezzük el egy folyamatban, ennek értéke kiválasztható a ComboBox kontrolban. A mérések átlagát számítva kideríthető, hogy melyik keresés volt a gyorsabb. A keresés időtartama másodpercben jelenik meg a szerkesztőmezőkben.
A felhasznált metódusok a QueryPerformanceCounter, és a QueryPerformanceFrequency. A keresés a következő SQL-utasítás volt, melyet a SqlCommand objektum CommandText property-jében megadtunk:
command.CommandText = "SELECT SUM(COL2) FROM " + tblList[j] + " WHERE (COL3 > " + i.ToString() + ")";
A projekt Counter.cs állományában létrehoztunk egy osztályt, melynek Start és Stop metódusaiba ágyaztuk a mérést végző metódusokat.
A méréseket tucatszor elvégezve az volt tapasztalható, hogy a Table1 tábla esetén kaptuk meg a leggyorsabban a megadott SELECT utasítás eredményét. Az eredmények azt tükrözték, hogy az index deklarálásával és használatával az eredmények kétszerte gyorsabban állnak rendelkezésre, mint index használata nélkül.

Oracle adatbázis-kezelés cikksorozat