Indexek ======= Az indexek szempontjából fontos a ROWID típus ismerete Speciális mutató típus, amivel egy sort lehet azonosítani. Minden sorról meg tudom mondani, hogy egy adott sor: - melyik adatfájlban van - azon belül melyik blokkban - azon belül hányadik rekord Ez nincs a táblában tárolva, de mégis úgy viselkedik: pszeudo oszlop Példa: SELECT rowid, empno, ename, sal FROM nikovits.emp; 18 karakteren íródik ki, a következő formában: OOOOOOFFFBBBBBBRRR OOOOOO - az objektum azonosítója FFF - fájl azonosítója (táblatéren belüli relatív sorszám) BBBBBB - blokk azonosító (a fájlon belüli sorszám) RRR - sor azonosító (a blokkon belüli sorszám) A ROWID megjelenítéskor 64-es alapú kódolásban jelenik meg. Az egyes számoknak (0-63) a következő karakterek felelnek meg: A-Z -> (0-25), a-z -> (26-51), 0-9 -> (52-61), '+' -> (62), '/' -> (63) Indexek létrehozása =================== CREATE INDEX (vagy ALTER INDEX) utasításban adhatók meg az index paraméterei. A hagyományos index B-fa szerkezetű, a fa leveleiben vannak a bejegyzések, és mellettük a sorazonosító (ROWID). Az index lehet 1 vagy többoszlopos. Ha egy érték többször szerepel a táblában, akkor az indexben is többször fog szerepelni, minden sorazonosítóval külön-külön. A levélblokkok mindkét irányban láncolva vannak, így növekvő és csökkenő keresésre is használható az index. (pl. WHERE o > x vagy WHERE o < y) A csupa NULL érték nem szerepel az indexben bejegyzésként. Érdemes a NULL értékek helyett DEFAULT-ot használni, épp az előzőek miatt. Az indexek esetén is megadhatók tárolási paraméterek, hasonlóan a táblákhoz. Az index létrehozásakor megadható legfontosabb paraméterek: UNIQUE -> egyedi index létrehozása ASC | DESC -> növekvő vagy csökkenő sorrend szerint épüljön-e fel az index CREATE UNIQUE INDEX emp1 ON EMP (ename); CREATE INDEX emp2 ON emp (empno, sal DESC); REVERSE Fordított kulcsú index létrehozása A kulcsoszlop bájtjai az indexben fordított sorrendben vannak. Ha több oszlopos az index, az oszlopok sorrendje nem változik. Ez főleg akkor hasznos, ha szekvencia alapján töltünk fel egy táblát (amikor a kulcsok sorban egymás után kerülnek kiosztásra), mert a fordított kulcsú index egyenletesen elosztja a bejegyzéseket az indexben. Viszont az ilyen index nem használható intervallum jellegű keresésekhez, mert a szomszédos értékek nem egymás mellett helyezkednek el. CREATE INDEX emp3 ON emp (empno, sal) REVERSE; Index újraépítése (időnként hasznos, mivel a törölt sorok bejegyzései fizikailag nem törlődtek ki) ALTER INDEX i1 REBUILD TABLESPACE ts1 [REVERSE | NOREVERSE]; A fenti utasítással új táblatérre tehető az index, a logikailag törölt bejegyzések helye felszabadul, és fordított kulcsúvá ill. normálissá is tehető az index. NOSORT Azt jelezzük vele, hogy nem kell rendezni az index létrehozásakor, mert a sorok már rendezve vannak. Ha mégsem így van, az oracle hibát jelez. Pl. CREATE TABLE ind_t(o1 int, o2 varchar2(20), o3 char(10)); BEGIN FOR i IN 1..100 LOOP INSERT INTO ind_t VALUES(i, 'sor'||to_char(i)||'-BLABLA', 'ABC'); END LOOP; COMMIT; END; CREATE INDEX ind_t_ix ON ind_t(o1) NOSORT; Ha még egy (o1=1) sort beszúrnánk a táblába, akkor már hibaüzenetet kapnánk a fenti NOSORT-ra. COMPRESS A kulcs értékek ismételt tárolását szüntetjük meg vele az index első n oszlopában. Vagyis ezek a kulcsértékek csak egyszer lesznek tárolva, és mellettük több sorazonosító lesz, azoknak a soroknak megfelelően, amelyek az adott értékkel rendelkeznek. CREATE INDEX emp4 ON emp (empno, ename, sal) COMPRESS 2; Függvény alapú index ==================== Akkor hasznos, ha a lekérdezésben is e kifejezés szerint keresünk. (plusz infók a katalógusban -> DBA_IND_EXPRESSIONS) CREATE INDEX ind_t_ix3 ON ind_t (SUBSTR(o2, 1, 5), UPPER(o3)); BITMAP Bitmap index létrehozása =============================== Hasonló a B-fa indexhez, de a levelekben a kulcsérték mellett nem a ROWID-k tárolódnak, hanem egy bittérkép. (Az első és utolsó érintett ROWID valamint a köztük lévő sorokra vonatkozó bittérkép.) Minden sornak egy bit felel meg, ami azokra a sorokra lesz 1-es, amelyek az adott értéket tartalmazzák. Módosításkor az egész bittérképet zárolni kell, így a bittérkép által érintett sorok sem módosíthatók a tranzakció végéig. CREATE BITMAP INDEX ind_t_ix4 ON ind_t (o2);