Kötelező feladat a 4. gyakorlathoz ------------------------------------------ Írják meg az alábbi, 6. feladatban szereplő LIST_INDEXES nevű procedúrát. Azt, hogy az output helyes-e ellenőrizni tudják a feladat után megadott 'CHECK_PLSQL' procedúra futtatásával. Határidő: a következő gyakorlat kezdete. =========================================================================== B+ fa index ----------- Az alábbi feladatban a tankönyben leírt és az előadáson is bemutatott 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,60,80 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 index (Feladat1) DKOD DNEV FIZETES FOGLALKOZAS BELEPES OAZON --------------------------------------------------- 1 SMITH 800 CLERK 1980 20 2 ALLEN 1600 SALESMAN 1981 30 3 WARD 1250 SALESMAN 1981 30 4 JONES 2975 MANAGER 1981 20 5 MARTIN 1250 SALESMAN 1981 30 6 BLAKE 2850 MANAGER 1981 30 7 CLARK 2450 MANAGER 1981 10 8 SCOTT 3000 ANALYST 1982 20 9 KING 5000 PRESIDENT 1981 10 10 TURNER 1500 SALESMAN 1981 30 11 ADAMS 1100 CLERK 1983 20 12 JAMES 950 CLERK 1981 30 13 FORD 3000 ANALYST 1981 20 14 MILLER 1300 CLERK 1982 10 a) Készítsen bitmap indexet a fenti DOLGOZO tábla OAZON oszlopára és adja meg a bitvektorokat. b) Tegyük fel, hogy a FOGLALKOZAS, a BELEPES és az OAZON oszlopokra létezik bitmap index (3 index). Készítsük el az alábbi lekérdezésekhez szükséges bitvektorokat, majd végezzük el rajtuk a szükséges műveleteket, és adjuk meg azt az előállt bitvektort, ami alapján a végeredmény sorok megkaphatók. Ellenőrzésképpen adjuk meg a lekérdezést SQL-ben is. Lekérdezés1 - Adjuk meg azoknak a dolgozóknak a nevét, akik 1981-ben léptek be és a foglalkozásuk hivatalnok (CLERK), vagy a 20-as osztályon dolgoznak és a foglalkozásuk MANAGER. Lekérdezés2 - Adjuk meg azoknak a dolgozóknak a nevét, akik nem 1981-ben léptek be és a 10-es vagy a 30-as osztályon dolgoznak. -------------------------------------------------------------------------------------------------- Bitmap index (Feladat2) Tömörítsük a következő bitvektort a szakaszhossz kódolással. (lásd UW_szakaszhossz_kodolas.doc) 0000000000000000000000010000000101 Fejtsük vissza a következő, szakaszhossz kódolással tömörített bitvektort: 1111010101001011 -------------------------------------------------------------------------------------------------- Bitmap index (Feladat3) Tegyük fel, hogy a DOLGOZO tábla FIZETÉS és OAZON (osztály azonosító) oszlopára a következő bitmap indexek vannak létrehozva. Fizetés Bitvektor ------- ---------- 1000 0010010000 2000 0100100001 3000 1000001100 4000 0001000010 Oazon Bitvector ------ ---------- 10 1000100001 20 0110001000 30 0001010110 a) Hány dolgozó dolgozik a 10-es osztályon? b) Hány dolgozónak magasabb a fizetése 2500-nál a 30-as osztályon? c) Mennyi az átlagfizetés a 10-es osztályon? -------------------------------------------------------------------------------------------------- Bitmap index (Feladat4) Tegyük fel, hogy adottak az R relációra vonatkozóan az alábbi paraméterek: T(R) = 1000, V(R,A) = 20. a) Hány bitvektor van az 'A' oszlopra létrehozott bitmap indexben? b) Hány darab '1'-es van az egész bitmap indexben? c) Átlagosan hány 0-ás bit van az egyes bitvektorokban? -------------------------------------------------------------------------------------------------- Oracle indexek -------------- (DBA_INDEXES, DBA_IND_COLUMNS, DBA_IND_EXPRESSIONS) 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álhatók az ab2_oracle.docx állományban szereplő példák, vagy a cr_index.txt-ben szereplők.) Az alábbi lekérdezésekkel megállapítjuk az iménti indexeknek mindenféle tulajdonságait a katalógusokból. 1. 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 2. 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.) 3. Adjuk meg a NIKOVITS.CUSTOMERS táblára létrehozott bitmap indexek nevét. 4. Adjuk meg azon kétoszlopos indexek nevét és tulajdonosát, amelyeknek legalább az egyik kifejezése függvény alapú. 5. Adjuk meg az egyikükre, pl. a NIKOVITS felhasználó 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.) 6. Írjunk meg egy plsql procedúrát, amelyik a paraméterül kapott táblára vonatkozóan kiírja a tábla indexeit és azok méretét bájtban. Az indexeket abc sorrendben, külön sorokban kell kiírni, a méretet szóközzel elválasztva az index nevétől így: INDEX1: 1234 INDEX2: 5678 (az index neve után van egy kettőspont) CREATE OR REPLACE PROCEDURE list_indexes(p_owner VARCHAR2, p_table VARCHAR2) IS ... Tesztelés: SET SERVEROUTPUT ON EXECUTE list_indexes('nikovits', 'customers'); Ellenőrzés: ---------- EXECUTE check_plsql('list_indexes(''nikovits'', ''customers'')'); -----------------------------------------------------------------------