Kezdőlap     AB2ea     AB2gyak (főmenü)     2.gyak      4.gyak

3.gyak. Hasítóindex (elmélete) és gépes feladatok ROWID-re
   
G (gépes feladatok)   
> G5. Gépes feladatok ROWID adattípussal  
E (elméleti témakör)
> E1. Oracle adatbázisok felépítése
> E2. Hasítóindex szervezés (Tk.4.4. fejezete)
   

A gyakorlati foglalkozások az előadások anyagára épülnek
3.EA: A fizikai fájlszervezés folytatása (elsődleges és másodlagos index,
ismétlődő kulcsértékek, klaszter, többszintű index) fizika.ppt (21-48 o.)
Néhány gyakorlati tudnivaló a fentiekkel kapcsolatban az Oracle lehetőségeiről,
pl. klaszter, függvény alapú index, ROWID, PCTUSED, PCTFREE paraméter,
abterv_ea1.doc
   
-- előadáshoz kapcsolódó további olvasmány:
Molina-Ullman-Widom: Adatbázisrendszerek megvalósítása, Panem, 2001. 
4.1. Indexek szekvenciális fájlokon.
4.2. Másodlagos indexek
   
G5. Gépes feladatok ROWID adattípusra  

Segédanyagok: Táblák létrehozása tárolási paraméterek.txt
   
ROWID adattípus formátuma és jelentése
(lásd még DBMS_ROWID package)

18 karakteren írodik ki, a következő formában: OOOOOOFFFBBBBBBRRR
OOOOOO -  az objektum azonosítója
FFF    -  fájl azonosítója (táblatéren belüli relativ 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)

Pl. 'AAAAAB' -> 000001
      
Feladatok:
5.01. A HR felhasználó EMPLOYEES táblája hány blokkot foglal le az adatbázisban?
         (Vagyis azt nézzük meg, hogy hány olyan blokk van, ami ehhez a táblához van
          rendelve és így azok már más táblákhoz nem adhatók hozzá?) (DBA_SEGMENTS)
          Hasonlítsuk össze ezt azzal, hogy mennyi a foglalt hely összesen? (DBA_EXTENTS)
   
5.02. A HR felhasználó EMPLOYEES táblájának adatai hány blokkban helyezkednek el?
         (Vagyis a tábla sorai ténylegesen hány blokkban vannak tárolva?)
         !!! -> Ez a kérdés nem ugyanaz mint az előző, most a ROWID-et használjuk!
 
5.03. Az egyes blokkokban hány sor van?
     
5.04. Hozzunk létre egy olyan táblát (lásd tárolási paraméterek.txt) az EXAMPLE táblatéren,
         amelynek szerkezete megegyezik a HR.EMPLOYEES tábláéval és pontosan
        128 KB helyet foglal az adatbázisban. Foglaljunk le manuálisan egy újabb 128 KB-os
        extenst a táblához. Vigyünk fel sorokat addig, amig az első blokk tele nem lesz,
        és 1 további sora  lesz még a táblának a második blokkban.
        (A felvitelt plsql programmal végezzük és ne kézzel, mert úgy kicsit sokáig tartana.)
 
5.05. Próbáljuk ki az előzőt ismét, de most a PCTFREE értéket állítsuk 40-re.
         Mindkét esetben ellenőrizzük is, hogy a sorok tényleg két blokkban vannak,
         és a másodikban csak egyetlen sor van.
    
Házi feladat:
   
HF03. Írjunk meg egy PL/SQL függvényt, amely a ROWID 64-es kódolásnak
        megfelelő számot adja vissza. A függvény paramétere egy karakterlánc,
        eredménye pedig a kódolt numerikus érték legyen. (Elég ha a függvény
        maximum 6 hosszú, helyesen kódolt karakterláncokra működik, hosszabb
        karakterláncra vagy rosszul kódolt paraméterre adjon vissza -1-et.)
        Ennek a fv-nek a segítségével adjuk meg egy táblabeli sor pontos fizikai
        elhelyezkedését. (Melyik fájl, melyik blokk, melyik sora)
        Például az emp tábla azon sorára, ahol a dolgozó neve 'KING'.
 
Megjegyzés: A gyakorlatok egyik célkitűzése az is, hogy az Oracle Database
Online Documentation könyvtárban otthonosan mozogjunk, lásd például 
PL/SQL Packages and Types Reference "DBMS_ROWID" fejezetét.
Gyakorlásként írjuk meg a fenti PL/SQL függvényt. A megírt függvényünk
működését könnyen ellenőrizhetjük az DBMS_ROWID csomagban
szereplő függvényekkel, az alábbi utasítással, írjuk be a függvényünket
minden substr(...)-hoz egészítsük ki a sajátfvnév(substr(...))-el.

       SELECT rowid, substr(rowid, 1, 6),
         DBMS_ROWID.rowid_object(ROWID),
         substr(rowid, 7, 3),
         DBMS_ROWID.rowid_relative_fno(ROWID),
         substr(rowid, 10, 6),
         DBMS_ROWID.rowid_block_number(ROWID),
         substr(rowid, 16, 3),
         DBMS_ROWID.rowid_row_number(ROWID)
    FROM orauser.emp
    WHERE ename='KING';

     
Fel a lap tetejére (mai gyak témakörei)      Vissza az AB2gyak kezdőlapjára  
  
E1. Oracle adatbázisok felépítése
     
Oracle adatbázisok felépítése, lásd 1.előadás: Abterv_ea1.ppt
és gyakorlati tudnivalók az Oracle lehetőségeiről: abterv_ea1.doc
    
E2. Hasítóindex szervezés (Tk.4.4. fejezete)
     
Segédanyagok:
Hasító index, lásd 2.előadás:  fizika.p9fizika.pp11-16 és fizika.pp17-20
Molina-Ullman-Widom: Adatbázisrendszerek megvalósítása, Panem, 2001.
4.fej. Indexstruktúrák -> 4.4. Tördelőtáblázatok dinamikus_tordeles.pdf
 
Feladatok:
E2.1 Kiterjeszthető hasító index (vagy másképp kiterjeszthető tördelőtáblázat)
        A kosártömb mérete mindig pontosan 2**i.
        Tegyük fel, hogy egy blokkba 2 rekord fér el, j értéke (a blokkok jobb oldalán)
        azt jelzi, hogy hány bit használatos a blokkhoz tartozás eldöntésére.

 i=1 ---- 0001
0 | -|---> ----1
| |
1 | -|---> 1001
---- 1100
----1
       kosártömb        blokkok
       
       Szúrjuk be az alábbi hasító értékkel rendelkező sorokat egymás után,
       és minden újabb blokk létrehozása után rajzoljuk újra a kosártömböt
       és a blokkokat.
 0001, 0110, 1011, 0111, 1100, 1111, 0100
-- Egy kis segítség a kiterjeszthető hasító indexhez:
A K kulcsú rekordot h(K) első i bitje alapján helyezzük el úgy, hogy
követjük a kosártömb ezen bejegyzéséhez tartozó mutatót.
Ha nincs hely a megtalált blokkban akkor a következőt tesszük:
1. Ha j < i akkor újabb blokkot hozunk létre és a j+1-edik bit alapján
kettéosztjuk a rekordokat a két blokk között (mindkét blokkra j+1 lesz
az új érték), majd a kosártömb szükséges mutatóit az új blokkra irányítjuk.
2. Ha j = i akkor először i-t növeljük 1-gyel, megduplázzuk a kosártömböt,
új mutatókat teszünk bele, majd alkalmazzuk 1.-et.
     
 E2.2. Lineáris hasító index
         Az előre megadott küszöbszám (rekordok száma/kosarak száma)
         legyen 2,4. (H.F.: Nézzük meg akkor is, ha a küszöbszám 1,7!)
         Készítsünk lineáris hasító indexet, tegyük fel, hogy egy blokkba
         2 rekord fér el és a kosarak az alábbi rekordokat tartalmazzák:
 0000 0101
1110
---- ----
0 1
       Szúrjuk be az alábbi hasító értékkel rendelkező sorokat egymás után,
       és minden újabb blokk megnyitás után rajzoljuk újra a kosarakat.
 0001, 0110, 1011, 0111, 1100, 1111, 0100
-- Egy kis segítség a lineáris hasító indexhez:
Ha n kosarunk van, akkor a K kulcsú rekordot h(K) utolsó i bitje alapján
tesszük a megfelelő kosárba (i=log2n).
Ha nincs benne hely, akkor újabb blokkot láncolunk ehhez a kosárhoz.
Ha nincs ilyen kosár, akkor az első bitben különböző kosárba tesszük.
Ha az előre megadott küszöböt átléptük, akkor új kosarat nyitunk.
Szükség esetén növeljük i-t

Fel a lap tetejére (mai gyak témakörei)      Vissza az AB2gyak kezdőlapjára