Megj. a gépes feladatokhoz: Nézzünk
meg többféle lekérdezési lehetőséget!
Például a 4.05. feladatban a legnagyobb
érték
kifejezésére különböző
ötletek?
Tanulságok, különböző megoldások
összevetése, melyik
lekérdezés hatékonyabb?
A 4.07. feladatban a táblák
összekapcsolásánál vigyázni kell az
adatszótár nézetek
áltatalában mind tartalmaznak BYTES nevű oszlopot
és ez nem
kapcsoló-mező!
Megj. az előadás anyaghoz:
Köv.héten elkezdjük az
előadáshoz
kapcsolódó
"táblás/papíros"-feladatokat.
HF átnézni az előadás anyagot! Itt a gyakorlaton
a
"Molina-Ullman-Widom: Adatbázisrendszerek
megvalósítása" tankönyv szerinti
sorrendben haladunk, ezért ami most volt az
előadáson az aktuális 3.EA
anyagát
(Tk.4.4
Tördelőtáblázatok) csak két hét
múlva az
5.gyakorlaton dolgozzuk fel,
és a köv.héten a 4.gyakorlaton lesz a 4.EA
anyaga
(Tk.4.1-4.3. Indexek, B-fa). G4.
Adattárolással
kapcsolatos feladatok DBA_TABLES,
DBA_DATA_FILES, DBA_TEMP_FILES,
DBA_TABLESPACES, DBA_SEGMENTS,
DBA_EXTENTS,
DBA_FREE_SPACE
-- Ez az utóbbi Figure
12-1 nagyon fontos ábra (és a hozzá
kapcsolódó nézetek)
-- Hasonlítsuk össze: DBA_SEGMENTS -> SEGMENT_TYPE
DBA_OBJECTS -> OBJECT_TYPE és DATA_OBJECT_ID
4.01. Melyik táblatéren van az ORAUSER
felhasználó dolgozo
táblája? (DBA_TABLES)
4.02. Adjuk meg az adatbázishoz tartozó
adatfile-ok
(és temporális fájlok)
nevét és méretét
méret szerint csökkenő sorrendben. (DBA_DATA_FILES, DBA_TEMP_FILES)
4.03. Adjuk meg, hogy milyen táblaterek vannak
létrehozva az adatbázisban,
az egyes
táblaterek hány
adatfájlból
állnak, és mekkora az
összméretük.
(tablater_nev,
fajlok_szama, osszmeret) Vigyázat, van
temporális
táblatér is!
4.04. Mekkora a blokkok mérete a USERS
táblatéren? (DBA_TABLESPACES)
4.05. Melyik a legnagyobb méretű tábla szegmens
az
adatbázisban (a tulajdonost és
a szegmens nevét is adjuk
meg) és
hány extensből áll? (DBA_SEGMENTS)
(A
particionált táblákat most ne vegyük
figyelembe.)
4.06. Melyik a legnagyobb méretű index szegmens az
adatbázisban és hány
blokkból áll?
(A
particionált indexeket most ne vegyük
figyelembe.)
4.07. Adjuk meg adatfájlonként, hogy az egyes
adatfajlokban mennyi a foglalt hely összesen.
(Írassuk ki a fájlok
nevét és méretét is). (DBA_EXTENTS, DBA_DATA_FILES)
4.08. Melyik két felhasználó
objektumai
foglalnak összesen a legtöbb helyet az
adatbázisban?
4.09. Van-e valamelyik felhasználónak olyan
táblája, amelyik több
adatfájlban is foglal
helyet?
4.10. Válasszunk ki a fenti
táblákból egyet
(pl. nikovits.tabla_123) és adjuk meg, hogy
ez a
tábla mely
adatfájlokban foglal helyet.
4.11. Írjunk
meg egy PL/SQL
procedúrát,
amelyik
kiírja, hogy a paraméterül
kapott
tábla
melyik fájlban mennyi helyet
(hány
adatblokkot) foglal el
(Fájlnév,
Méret) -->
proc(tulajdonos,
táblanév).
Hívjuk
meg az
eljárást
(’SH’,
’CUSTOMERS’) paraméterekkel.
G5.
Táblák és
tárolási
paraméterek, feladatok ROWID-ra
Tárolással rendelkező objektumok tárolási
paraméterek megadása
(CREATE TABLE és ilyen lesz majd a CREATE INDEX, CREATE CLUSTER)
Az indexek szempontjából fontos még a ROWID
megbeszélése is:
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. Az SH
felhasználó CUSTOMERS
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. Az SH
felhasználó CUSTOMERS
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 PL/SQL
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.
Szorgalmi feladat
(beküldhető)
5.06. Í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.