IP-08abctAB2G   Adatbázisok-2 gyakorlat
ELTE, 2014/2015.tanév I.félév, dr. Hajas Csilla gyak.vez.
Hétfő 12:15-13:45 PC3, 14:00-15:30 PC3, Szerda 10:15-11:45 PC9
backAB2gyak (főmenü)    Gyak.köv.    2.gyak     4.gyak    OracleDoc
   
3.gyak. Adattárolással kapcsolatos feladatok
   
G (gépes feladatok) 
> G4. Fizikai és logikai adattárolással kapcsolatos fogalmak
> G5. Táblák és tárolási paraméterek, feladatok ROWID-ra
 
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


Segédanyag: LogDB_Struct.pdf  +  + 02-DBA nézetek.pdf 
>> Statikus adatszótár nézetek leírása: OracleDoc: Reference
>> Adattárolással kapcsolatos fogalmak: OracleDoc: Concepts
      > 1 Introduction to Oracle Database: Architecture
         --- 1 -> Figure 1-1 Oracle Instance and Database
         --- 2 -> Figure 2-2 Schema Objects Storage
      > 12 Logical Storage Structures   --- Figure 12-1 Logical and Physical Storage
   
--  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
 
Segédanyagok: Táblák létrehozása tárolási paraméterek.txt
>> OracleDoc: SQL Language Reference >> innen a CREATE utasítások

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:
   
ROWID adattípus formátuma és jelentése
(lásd még PL/SQL Packages and Types Reference >> 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. 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.

       SELECT rowid, empno, ename,
      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 sila.emp;

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