Adatbázisok EA+GY - Adatbázisok fizikai tervezése, Indexek

--- --- --- --- --- ---        
> 1.rész Metaadatbázis. Adatbázisbeli objektumok
  
objektumok.txt + 01-DBA nézetek.pdf
   Adatszótár-nézetek: Honnan kaphatunk információkat az adatbázisban
   tárolt dolgokról és azok tulajdonságairól? -> Az adatszótár nézetekből,
   amelyeknek neve általában a köv.karakterláncok valamelyikével kezdődik:
   USER (az adott user tulajdonában lévő objektumok) pl. USER_TABLES
   ALL  (amihez joga van az adott usernek) pl. ALL_TABLES
   DBA  (az adatbázis összes objektuma) pl. DBA_TABLES
   
- Milyen dolgok vannak az adatbázisban? Például táblák, nézetek, indexek, stb.
- Minden fel van sorolva a típusával együtt a DBA_OBJECTS adatszótárban.
- Minden adatbázisbeli objektumnak van egy egyedi objektum azonosítója (OBJECT_ID),
  és amelyikhez tartozik szegmens, annak egy úgynevezett adatobjektum azonosítója is van
  (DATA_OBJECT_ID). Amelyik objektumhoz nem tartozik szegmens, annak az adatobjektum
  azonosítója NULL vagy 0, és ezeknek csak a definíciója van (szövegesen) tárolva a szótárban. 
  Ezen utóbbi objektumokra azt mondjuk, hogy tényleges tárolást nem igénylő objektumok.
   
Feladatok:
1.01. Kérdezzük le a DBA_OBJECTS, ALL_OBJECTS és USER_OBJECTS nézeteket.
1.02. Kinek a tulajdonában van a DBA_TABLES nevű nézet valamint a DBA_TABLES
         nevű szinonima? (A két lekérdezés megmagyarázza, hogy miért tudjuk elérni őket.)
1.03. Milyen típusú objektumai vannak az orauser nevű felhasználónak az adatbázisban?
         (a katalógustáblákban nagy betűvel vannak az adatok 'orauser' helyett 'ORAUSER')
1.04. Hány különböző típusú objektum van nyilvántartva az adatbázisban? Melyek ezek a típusok?
1.05. Melyek azok az objektum típusok, amelyek tényleges tárolást igényelnek, vagyis
         tartoznak hozzájuk adatblokkok? (A többinek csak a definíciója tárolódik adatszótárban)
1.06. Melyek azok az objektum típusok, amelyek nem igényelnek tényleges tárolást, vagyis nem
         tartoznak hozzájuk adatblokkok? (Ezeknek csak a definíciója tárolódik adatszótárban)
        Az utóbbi két lekérdezés metszete nem üres. Vajon miért? -> lásd majd partícionálás
1.07. Kik azok a felhasználók, akiknek több mint 10 féle objektumuk van?
1.08. Kik azok a felhasználók, akiknek van triggere és nézete is?
1.09. Kik azok a felhasználók, akiknek van nézete, de nincs triggere?
1.10. Kik azok a felhasználók, akiknek több mint 40 táblájuk, de maximum 37 indexük van?
   
--- --- --- --- --- ---
> 2.rész Táblák és oszlopai, megszorítások
   
Táblák létrehozása, oszloptípusok.txt  
   Mely táblák vannak egy adott felhasználó tulajdonában?
   - A DBA_TABLES adatszótár az összes táblát felsorolja, például HR séma táblái ezek:
     SELECT table_name FROM dba_tables WHERE owner='HR';
   Mit tudhatunk a táblák oszlopairól, milyen nevű és típusú oszlopai vannak, sorrendjük, stb.
  - A DBA_TAB_COLUMNS adatszótár a táblák oszlopairól tartalmaz információt.
     
Feladatok:
2.01. Hozzunk létre táblákat, majd keressük meg az adatszótár nézetekben,
         hogy milyen információkat találhatunk a táblákról és a táblák oszlopairól.
         Adatszótár nézetek: DBA_OBJECTS, DBA_TABLES és DBA_TAB_COLUMNS 
2.02. Hozzunk létre táblákat megszorításokkal, majd nézzük meg hogyan jelennek meg
         az oszlopok és a megszorítások a DBA_CONSTRAINTS katalógustáblában is.
2.03. Hozzunk létre nézettáblákat, majd nézzük meg a DBA_VIEWS katalógustáblában.
2.04. Hány oszlopa van a sila.emp táblának?
2.05. Milyen típusú a sila.emp tábla 6. oszlopa?
2.06. Adjuk meg azoknak a tábláknak a tulajdonosát és nevét, amelyeknek van 'Z' betűvel
         kezdődő oszlopa.
2.07. Adjuk meg azoknak a tábláknak a nevét, amelyeknek
         legalább 8 darab dátum tipusú oszlopa van.
2.08. Adjuk meg azoknak a tábláknak a nevét, amelyeknek
         1. es 4. oszlopa is VARCHAR2 tipusú.
   
--- --- --- --- --- ---
> 3.rész Adattárolás
             
Táblák létrehozása tárolási paraméterek.txt
             LogDB_Struct.pdf  +  + 02-DBA nézetek.pdf 
       DBA_TABLES, DBA_DATA_FILES, DBA_TEMP_FILES,
       DBA_TABLESPACES, DBA_SEGMENTS, DBA_EXTENTS, DBA_FREE_SPACE
   
 
Feladatok:
3.01. Melyik táblatéren van az ORAUSER felhasználó dolgozo táblája? (DBA_TABLES)
   
3.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)
   
3.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!
   
3.04. Mekkora a blokkok mérete a USERS táblatéren? (DBA_TABLESPACES)
   
3.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.)
   
3.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.)
   
3.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)
   
3.08. Melyik két felhasználó objektumai foglalnak összesen a legtöbb helyet az adatbázisban?
   
3.09. Van-e valamelyik felhasználónak olyan táblája, amelyik több adatfájlban is foglal helyet?
 
--- --- --- --- --- ---
> 4.rész  ROWID
   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
 
       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;

   
Feladatok:
4.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)
   
4.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!
 
4.03. Az egyes blokkokban hány sor van?
     
 --- --- --- --- --- ---
> 5.rész  Indextáblák
   -- Molina-Ullman-Widom: Adatbázisrendszerek megvalósítása, Panem, 2001.
       4.fejezete -> Indexstruktúrák.pdf -->> Innen a fontosabb részletek:
          Elsődleges indexek, Másodlagos indexek, B-fák, Hasító indexek
          -->> lásd még Molina-Ullman könyv: B-fák és Hasító indexek.pdf
   -- Oracle Példák  1/10.lecke  és 2/1.lecke  SQL DDL (megszorítások, indexek) 
       >> OracleDoc: SQL Language Reference >> innen CREATE INDEX példák
       >> Alapfogalmak Oracle Database Concepts 
       például Concepts (11g) 3.fej. Indexek vagy Concepts (10g) 5.fej.Indexek
   
Feladatok:
5.01. 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ű, függvény alapú,
         fordított kulcsú (reverse), bitmap index, lásd create index példák.txt
         Állapítsuk meg ezeknek az indexeknek a különböző tulajdonságait
         az alábbi katalógusokból:
     DBA_INDEXES, DBA_IND_COLUMNS, DBA_IND_EXPRESSIONS
 
5.02. Adjuk meg azoknak a tábláknak a nevét, amelyeknek van csökkenő
         sorrendben indexelt oszlopa.

5.03. 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).

5.04. Adjuk meg az SH.SALES táblára létrehozott bitmap indexek nevét.

5.05. Adjuk meg azon kétoszlopos indexek nevét és tulajdonosát, amelyeknek
         legalább az egyik kifejezése függvény alapú. Adjuk meg az egyikükre,
         például az OE tulajdonában lévőre, hogy milyen kifejezések szerint vannak
         indexelve a soraik (vagyis mi a függvény, ami alapján a bejegyzések készülnek).