2007. november 21., szerda

Architektúra part #1 – Logikai struktúra

Az Oracle Database logikai felépítése alapvetően három szintből áll. A legkisebb egységet az adatblokkok (data blocks) képezik, amik egy előre meghatározott, fix pár bytenyi részt jelentenek. A fizikailag folytonosan elhelyezkedő, valamilyen tárolási célból előre lefoglalt adatblokkok képezik a következő szintet, az extenteket. Ha egy extent betelik, de szükség van további szabad helyre, akkor új extentet kell foglalnunk. Az így keletkező, azonos célra foglalt, s azonos táblahelyen (tablespace) elhelyezkedő extentek alkotják a harmadik hierarchia szintet, a szegmenseket (segments).

Az adatblokkok méretét a DB_BLOCK_SIZE kezdeti paraméter beállításával adhatjuk meg, egy bizonyos felső korláttal, hogy elkerüljük a nagy adatblokkokból származó felesleges I/O-műveleteket.
Az adatblokkra vonatkozó információkat tartalmazó overheadet (header, table directory, row directory) leszámítva használt és szabad területekre oszthatjuk a felhasználás szempontjából lényeges helyet. Használatban lévő területet felszabadítani nyilvánvalóan két utasítás fog: a DELETE és az olyan UPDATE, ami az addigi értéket egy kevesebb helyet foglalóra módosítja. Az így keletkező területek nem feltétlen fognak folytonosan elhelyezkedni, azonban mivel ezek az utasítások viszonylag gyakran előfordulhatnak, a töredezettség csökkentését csak akkor végzi el az Oracle Database, ha egy INSERT vagy UPDATE művelet olyan blokkot akar használni, ahol van elég hely számára, azonban nincs a blokkban olyan összefüggő hely, ami elég lenne számára.
Fontos még megemlíteni, hogyha egy tábla sorának az adatai nem férnek bele egy adatblokkba, akkor azt adatblokkok láncolásával illetve pointerekkel ugyan megoldja az adatbázis, de az ebből fakadó többszörös I/O műveletek csökkentik a teljesítményt.
Manuálisan felügyelt tablespaceknél két paramétert használhatunk az adatblokkok szabad területéhez történő hozzáférés vezérlésére:
A PCTFREE-vel beállíthatjuk, hogy az adatblokk hány százalékát akarjuk update-ekre fenntartani. Azaz ha az adatblokkban felhasznált terület eléri a (100-PCTFREE)%-t, akkor kiszedjük az adatblokkot ’free list’-ből (az a lista, amely tartalmazza, hogy mely adatblokkoknál alkalmazhatjuk az insert műveletet).
A PCTUSED paraméter egy minimum értéket ad a használt területre, amíg nem kezdeményezhetünk új instertet. Azaz ha a felhasznált terület az itt megadott érték alá esik, akkor az adatblokk visszakerül a ’free list’-be, s ismét lehet új sorokat is ide beilleszteni.

Az extentek néhány folytonosan elhelyezkedő adatblokkot jelentenek, melyek lefoglalása egyidejűleg és előre történik. Például egy tábla létrehozásakor automatikusan lefoglal neki az Oracle Database egy kezdeti extentet, majd ha ez a terület kevésnek bizonyul, akkor további, legalább a kezdeti extent méretével egyező, vagy annál nagyobb extenteket. Ehhez a datafile-ok bitmapjeit használja, amik alapján megállapítható, hogy hol van megfelelő mennyiségű szomszédos szabad blokk.
Az extentek felszabadítása alapesetben csak akkor történik meg, ha töröljük az adott táblát. Kivételt képeznek ez alól a manuális műveletek, illetve a rollback szegmens, aminek méretét az Oracle Database periódikusan optimalizálja.

Azok az extentek, melyek egy tablespacen belül logikailag összetartozó struktúrát képeznek, alkotnak egy szegmenset. Például egy táblához vagy indexhez tartozó extentek jelentik az adott táblához illetve indexhez tartozó szegmenset.
A hatékonyság szempontjából fontos tárolási paramétereket mind a táblák, mind az indexek létrehozásakor illetve módosításukkor beállíthatjuk. Egy indexnek azonban nem feltétlen kell az általa hivatkozott táblával egy tablespaceben lennie… így a tárolási paraméterek beállításánál akár egy másik tablespacet is választhatunk.
Léteznek még az ún. ideiglenes szegmensek is, melyeket az Oracle Database automatikusan lefoglal, ha valamely művelet végrehajtása során szüksége van a memóriát meghaladó területekre, vagy ha egy tranzakció során ideiglenes táblá(ka)t használunk. Az ideiglenes szegmensek tárolására használt tablespaceket a felhasználók létrehozásánál illetve módosításánál a TEMPORARY TABLESPACE paraméterrel állíthatjuk be. Ez alapesetben a SYSTEM tablespacet jelenti, azonban ajánlott legalább egy ilyen tablespacet létrehozni, hogy elkerüljük a SYSTEM nagymértékű tördelődését.
Fontos még megjegyezni, hogy a 9i verziótól ugyan már automatikusan működik a tranzakciók visszagörgetése – amivel egy inkonzisztens állapotból térhetünk vissza egy konzisztensbe -, azonban egy rosszul működő tranzakció túlságosan nagy részét foglalhatja el az visszagörgetéshez használt undo tablespacenek. Ezért lehetőség van a felhasználók egy bizonyos csoportjának, vagy akár egy adott felhasználónak is közvetlen korlátozni az undo területét. Erre szolgál az UNDO_POOL paraméter, melynek default értéke természetesen UNLIMITED. Így ha egy csoport egy felhasználója megtölti a csoport számára kijelölt területet, akkor nem hajthat végre további update-eket mindaddig, amíg egy másik csoportbéli felhasználó tranzakciója be nem fejeződik, s ezáltal területek szabadulnak fel.


Kapcsolódó link:
Oracle® Database Concepts: Data Blocks, Extents, and Segments