Indexek ------- DKOD DNEV FIZETES FOGLALKOZAS OAZON -------------------------------------- 1 SMITH 800 CLERK 20 2 ALLEN 1600 SALESMAN 30 3 WARD 1250 SALESMAN 30 4 JONES 2975 MANAGER 20 5 MARTIN 1250 SALESMAN 30 6 BLAKE 2850 MANAGER 30 7 CLARK 2450 MANAGER 10 8 SCOTT 3000 ANALYST 20 9 KING 5000 PRESIDENT 10 10 TURNER 1500 SALESMAN 30 11 ADAMS 1100 CLERK 20 12 JAMES 950 CLERK 30 13 FORD 3000 ANALYST 20 14 MILLER 1300 CLERK 10 Készítsen B-fa indexet a dolgozó tábla DKOD oszlopára. Tegyük fel, hogy egy blokkba 3 bejegyzés fér el. Rajzolja le a fát. 10 / \ / \ / \ 4|7 13 / | \ / \ / | \ / \ 1|2|3 4|5|6 7|8|9 10|11|12 13|14 Az alábbi feladatban a tankönyben szereplő algoritmussal építsünk fel egy B-fát! Tegyük fel, hogy egy B-fa blokkjaiba 3 kulcs fér el plusz 4 mutató. A kulcsok különbözőek. Szúrjuk be a B-fába az alábbi kulcsértékeket a megadott sorrendben: 39,15,50,70,79,83,72,43,75,45 Adjuk meg a B-fa minden olyan állapotát, amikor egy csomópont kettéosztására volt szükség. Például, az első kettéosztás utáni állapot: 50 15|39 50|70 Egy kis segítség: ---------------- Levél csúcs kettéosztásakor minden kulcsot megőrzünk a régi és az új (szomszédos) csúcsban. 1 új kulcs-mutató párt küldünk felfelé a szülő csúcsba, amit ott kell elhelyezni. Belső csúcs kettéosztásakor (N,M csúcsra) a mutatók első fele az N-be kerül, a második az M-be. A kulcsok első fele az N-be kerül a második fele az M-be, de középen kimarad egy kulcs, ami az M-en keresztül (első gyermekén keresztül) elérhető legkisebb kulcsot tartalmazza. Ez nem kerül sem N-be, sem M-be, hanem ez megy fölfelé N és M közös szülőjébe az M-re mutató mutatóval együtt. Bitmap ------ Készítsen bitmap indexet a dolgozó tábla OAZON oszlopára. Adja meg a bitvektorokat és a felépített B-fát is. Tömörítse a kapott bitvektorokat a szakaszhossz kódolással. Fejtsük vissza a következő, szakaszhossz kódolással tömörített bitvektort: 11101101001011 Hozzunk létre egy vagy több táblához több különböző indexet, legyen köztük több oszlopos, csökkenő sorrendű, bitmap, függvény alapú stb. (Ehhez használhatjátok az előadáson elhangzottakat, és az ott szereplő példákat.) Az alábbi lekérdezésekkel megállapítjuk az iménti indexeknek mindenféle tulajdonságait a katalógusokból. Adjuk meg azoknak a tábláknak a nevét, amelyeknek van csökkenő sorrendben indexelt oszlopa. Miért ilyen furcsa az oszlopnév? -> lásd DBA_IND_EXPRESSIONS SELECT * FROM dba_ind_expressions; Adjuk meg azoknak az indexeknek a nevét, amelyek legalább 9 oszloposak. (Vagyis a táblának legalább 9 oszlopát vagy egyéb kifejezését indexelik.) SELECT table_owner, table_name, index_name FROM dba_ind_columns WHERE column_position = 9 ORDER BY table_owner, table_name, index_name; SELECT index_owner, index_name FROM (SELECT DISTINCT index_owner, index_name, column_name FROM dba_ind_columns ) GROUP BY index_owner, index_name HAVING COUNT(*) >= 9; Adjuk meg az SH.SALES táblára létrehozott bitmap indexek nevét. SELECT index_name FROM dba_indexes WHERE table_owner = 'SH' AND table_name = 'SALES' AND index_type = 'BITMAP'; Adjuk meg azon kétoszlopos indexek nevét és tulajdonosát, amelyeknek legalább az egyik kifejezése függvény alapú . SELECT index_owner, index_name FROM dba_ind_expressions INTERSECT SELECT index_owner, index_name FROM dba_ind_columns GROUP BY index_owner, index_name HAVING COUNT(*) = 2; rossz?????? SELECT owner, index_name FROM (SELECT x.owner, x.index_name, y.column_name FROM dba_indexes x, dba_ind_columns y WHERE UPPER(x.index_type) LIKE 'FUNCTION%' AND x.index_name = y.index_name ) GROUP BY owner, index_name HAVING COUNT(*) = 2; Adjuk meg az egyikükre, pl. az OE tulajdonában lévőre, hogy milyen kifejezések szerint vannak indexelve a soraik. (Vagyis mi a függveny, ami alapján a bejegyzések készülnek.) SELECT index_owner, table_name, index_name CREATE OR REPLACE VIEW gyakorlat_04_001 AS SELECT owner, index_name FROM (SELECT x.owner, x.index_name, y.column_name FROM dba_indexes x, dba_ind_columns y WHERE UPPER(x.index_type) LIKE 'FUNCTION%' AND x.index_name = y.index_name ) GROUP BY owner, index_name HAVING COUNT(*) >= 2 AND UPPER(owner) = 'OE'; SELECT * FROM dba_ind_expressions x, gyakorlat_04_001 y WHERE x.index_name = y.index_name AND x.index_owner = y.owner; Adjuk meg a NIKOVITS felhasználó tulajdonában levő index-szervezett táblák nevét. (Melyik táblatéren vannak ezek a táblák? -> miért nem látható?) Adjuk meg a fenti táblák index részét, és azt, hogy ezek az index részek (szegmensek) melyik táblatéren vannak? Keressük meg a szegmensek között az előző táblákat illetve indexeket, és adjuk meg a méretüket. Keressük meg az adatbázis objektumok között a fenti táblákat és indexeket, és adjuk meg az objektum azonosítójukat és adatobjektum azonosítójukat (DATA_OBJECT_ID). Adjuk meg a fenti táblák túlcsordulási részeit (ha van). Keressük meg a túlcsordulási részeket a szegmensek között és adjuk meg a méretüket. Keressük meg az objektum azonosítóikat és az adatobjektum azonosítóikat is. Írjunk meg egy plsql procedúrát, amelyik a paraméterül kapott index szervezett tábláról kiírja a tábla méretét. PROCEDURE iot_meret(p_owner VARCHAR2, p_tabla VARCHAR2) Vigyázzunk, mert a táblának lehet index és túlcsordulási szegmense is. Adjuk meg azokat az index szervezett táblákat, amelyeknek pontosan 1 dátum típusú oszlopa van.