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';
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.p9,
fizika.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