Talán az egyik legnagyobb teljesítményhangolási technika az, ha az adatbázis tábláira az adatbázis-adminisztrátor indexeket hoz létre. Az indexeket alapvetően a teljesítmény növelésére használják. Az indexek különösen hasznosak a:
a táblák összekapcsolásában, ha az adatbázis-adminisztrátor indexet definiál a kapcsolóoszlopon, akkor az összekapcsolás megvalósítása sokkal hatékonyabb lesz
táblák közötti adatok összehasonlításánál
az adatok csoportosításánál
az adatok rendezésénél
Indexek nélkül az adatbázis adatainak elérése úgy menne végbe, hogy az adatbázis-kezelő rendszer egy tábla minden sorát végignézné. Ez nagyon nagy tábláknál nem hatékony.
Az indexek tervezése és létrehozása két teljesítmény-témakörhöz is odasorolható, hiszen az adatbázis-teljesítmény és az alkalmazásteljesítmény hangolásához egyaránt hozzátartozik. Az indexeket az adatbázis-adminisztrátor hozza létre CREATE utasítással.
Mielőtt az adatbázis-adminisztrátor az adatbázist indexek létrehozásával hangolná, fel kell mérnie, hogy mi lesz az index hozzáadásának a hatása. Ehhez az adatbázis-adminisztrátornak ismernie kell, hogyan éri el az adatbázis-kezelő rendszer annak a táblának az adatait, amelyre az indexet teszi. Hasznos információkat tartalmaz azon utasítások százaléka, amelyek inkább lekérdezik, mint módosítják a táblát; illetve az a teljesítményküszöb, amelyet a szolgáltatási szintről szóló megállapodás határoz meg a táblán való lekérdezésekhez. Az adatbázis-adminisztrátornak azt is vizsgálnia kell, hogy az új index hozzáadása milyen hatással lesz a későbbiekben az olyan adatbázis-segédprogramokra, mint a betöltés, az újraszervezés, és a helyreállítás.
Az adatbázis tervezésének az egyik nagy kérdése, hogy mennyi indexet kell egy táblához létrehozni. Az adatbázis-adminisztrátor csak a saját tapasztalatára támaszkodhat, amikor meghatározza az indexek megfelelő számát az egyes táblákhoz. Ezt a döntését arra alapozhatja, hogy az adatbázis-lekérdezések optimalizáltak legyenek és az adatbázis-beszúrások, módosítások, törlések teljesítménye ne sérüljön. Annak a meghatározása, hogy az egyes táblákra mennyi a megfelelő számú index, az adatbázis és az adatbázist elérő alkalmazások elemzése szükséges.
Az indexelemzés általános célja, hogy az adatbázis-kezelő rendszer kevesebb input/output műveletet használjon a táblára vonatkozó lekérdezések kiszolgálásához. Egy index néhány lekérdezésen segíthet, azonban másokat akadályozhat. Az adatbázis-adminisztrátornak minden alkalmazás esetén fel kell becsülnie egy index hozzáadásának hatását, nem csak egy lekérdezésre vonatkozóan.
Egy index pozitívan hat a teljesítményre, ha kevesebb input/output művelet használatával kapjuk meg egy lekérdezés eredményét. Egy index negatívan hat a teljesítményre a módosításnál, ha az adat módosításánál az indexet is módosítani kell. A hatékony indexstratégia megvalósítása esetén az adatbázis-adminisztrátor a lehető legnagyobb mértékben igyekszik csökkenteni az input/output műveletek számát, de mindezt úgy, hogy közben az adatbázis-kezelő rendszer az indexek naprakészen tartására még elfogadható mértékű erőforrás-ráfordítást használjon fel.
Ha új indexet hozunk létre, akkor teszteljük le teljesen az index által támogatott lekérdezések teljesítményét. Teszteljük az adatbázis adatait módosító utasításokat, hogy megmérjük az új indexek frissítésével járó terhelést, nézzük meg a processzor időt, az eltelt időt, és az input/output műveletek követelményeit, hogy biztosak legyünk, hogy az index valóban a teljesítmény javulását segíti elő. Ne feledjük el, hogy a hangolás egy iteratív folyamat és időt vesz igénybe a változás hatásának meghatározása. Az index létrehozására nincsenek szabályok, próbáljunk ki különböző indexvariációkat és mérjük le az eredményt.
Ha a tábla túl kicsi, kevesebb mint 10 adatlap, akkor kerüljük az indexet. Az indexelt elérés egy kis tábla esetén kevésbé hatékony. Mivel az index olvasáshoz is input/output műveleti költség járul, nem kerül többe a tábla minden sorát végignézni.
Az index input/output műveletek ellenére egy kis tábla esetén is lehet előnye az indexnek, pl. ha az egyediséget ki akarjuk kényszeríteni, vagy ha a legtöbb adatkinyerés csupán egy sor elérése az elsődleges kulcs segítségével, illetve bonyolult funkcionális indexek esetében.
Ha az adatbázis-kezelő rendszer az indexben a változó hosszúságot kiterjeszti a lehető legnagyobb hosszúságra, akkor esetleg érdemes a változó hosszúságú oszlopok indexelését is kerülni. Ez a kiterjesztés azt eredményezheti, hogy az indexek mértéktelen mennyiségű lemezterületet használnak és nem hatékonyak. Ha a változó hosszúságú oszlopokat a WHERE utasításrészben használjuk, az indexhez használt lemezterület költségét össze kell hasonlítani a teljes keresés költségével.
Kerüljük az indexelést azon tábláknál, ahol az elérésnél mindig a teljes táblát keressük, és az olyanoknál, ahol soha nem használunk WHERE utasításrészt.
Az indexek általában a SELECT utasításnak a WHERE részén alapulnak. Tekintsük a következő lekérdezést:
SELECT DOLGOZO_AZON, KERESZTNEV, FIZETES
FROM DOLGOZO
WHERE FIZETES ≥150000;
Ha olyan indexet hozunk létre, amelyben a FIZETES oszlop szerepel, az ennek a lekérdezésnek a teljesítményét növelheti. De az adatbázis-adminisztrátor a teljesítményt tovább növelheti, ha az indexet túlterheli a DOLGOZO_AZON, és a KERESZTNEV oszlopokkal. A túlterhelt index használatával az adatbázis-kezelő rendszer a lekérdezés eredményét csak az indexben tárolt adatok alapján visszaadhatja. Az adatbázis-kezelő rendszernek nincs szüksége további input/output műveletekre, hogy elérje a tábla adatait, mivel a lekérdezés által kért minden adat benne van a túlterhelt indexben.
Az adatbázis-adminisztrátornak érdemes megfontolnia a túlterhelt indexek használatát, hiszen így támogathatja a lekérdezések olyan módú megvalósítását, amelyben az adatbázis-kezelő rendszer csak az indexet használja, és a táblát nem. A túlterhelt indexeket akkor is érdemes használni, ha több lekérdezés számára lehet előnyös az index vagy az egyes lekérdezések nagyon fontosak.