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 sila.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 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. 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. ======= drop index emp1; drop index emp2; drop index emp3; drop index emp4; drop index emp5; drop index emp6; -- előtte: CREATE TABLE emp AS SELECT * FROM sila.emp; CREATE UNIQUE INDEX emp1 ON emp (ename); CREATE INDEX emp2 ON emp (job, sal DESC); CREATE INDEX emp3 ON emp (job, sal) REVERSE; CREATE INDEX emp4 ON emp (deptno, job, sal) COMPRESS 2; CREATE BITMAP INDEX emp5 ON emp (mgr); CREATE INDEX emp6 ON emp (SUBSTR(ename, 2, 2), job); ======= A fenti indexekre vonatkozó információk az adatszótár nézetekben: -------------------------------------------------------------------- -- DBA_INDEXES -- DBA_IND_COLUMNS (indexbeli oszlopok) -- DBA_IND_EXPRESSIONS (függvény alapú index kifejezései) SELECT table_name, index_name, index_type, uniqueness, compression, prefix_length FROM dba_indexes WHERE table_owner='SILA' AND table_name='EMP'; tab ind index_type unique compress prefix ------------------------------------------------------------------ EMP EMP1 NORMAL UNIQUE DISABLED null EMP EMP2 FUNCTION-BASED NORMAL NONUNIQUE DISABLED null EMP EMP3 NORMAL/REV NONUNIQUE DISABLED null EMP EMP4 NORMAL NONUNIQUE ENABLED 2 EMP EMP5 BITMAP NONUNIQUE DISABLED null EMP EMP6 FUNCTION-BASED NORMAL NONUNIQUE DISABLED null A fenti eredményből látható, hogy a csökkenő sorrendű oszlopot (EMP2 indexben) is úgy tekinti a rendszer, mintha függvény alapú index volna. Valószínűleg úgy van implementálva, hogy (-1)-el megszorozza a kulcsértékeket és ezeket tárolja a levél szinten. SELECT index_name, column_name, column_position, descend FROM dba_ind_columns WHERE table_owner='SILA' AND table_name='EMP'; ind col pos desc ----------------------------- EMP1 ENAME 1 ASC EMP2 JOB 1 ASC EMP2 SYS_NC00009$ 2 DESC EMP3 JOB 1 ASC EMP3 SAL 2 ASC EMP4 DEPTNO 1 ASC EMP4 JOB 2 ASC EMP4 SAL 3 ASC EMP5 MGR 1 ASC EMP6 SYS_NC00010$ 1 ASC EMP6 JOB 2 ASC SELECT index_name, column_position, column_expression FROM dba_ind_expressions WHERE table_owner='SILA' AND table_name='EMP'; ind pos expr ---------------------- EMP2 2 "SAL" EMP6 1 SUBSTR("ENAME",2,2)