M2 - Bases de dades / Continguts UF3: Emmagatzemament

De wikiserver
La revisió el 10:13, 5 feb 2018 per Rsort (Discussió | contribucions) (Datafile)
Dreceres ràpides: navegació, cerca

Tablespace

Una base de dades es divideix en unitats lògiques denominades TABLESPACES. Un tablespace no és un fitxer físic en el disc, simplement és el nom que té un conjunt de propietats d'emmagatzematge que s'apliquen als objectes (taules, seqüències...) que es van a crear en la base de dades sota el tablespace indicat (taules, seqüències...).

Un objecte de la base de dades ha d'estar emmagatzemat obligatòriament dins d'un tablespace.

Les propietats que s'associen a un tablespace són:

  • Localització dels fitxers de dades.
  • Especificació de màximes quotes de consum de disc.
  • Control de la disponibilitat de les dades (en línia o fora de línia).
  • Backup de dades.

Quan un objecte es crea dins d'un cert tablespace, aquest objecte adquireix totes les propietats abans descrites del tablespace utilitzat.

Tablespace

En aquest esquema podem veure que, per exemple, la taula ARTICULO s'emmagatzema dins del tablespace A, i que per tant tindrà totes les propietats del tablespace A que poden ser::

  • Els seus fitxers de dades estan en $ORACLE_HOME/dades/dades_tablespace_A
  • Els objectes no poden ocupar més de 10Mb d'espai de base de dades.
  • A qualsevol moment es pot posar fora de línia tots els objecte d'un cert tablespace.

Es pot tenir una taula en un tablespace, i els índexs d'aquesta taula en un altre. Això és a causa que els índexs són objectes independents de les taules.

  • Tablespace SYSTEM: es crea per defecte. En ell s'emmagatzemen totes les dades de sistema, el catàleg i tot el codi font i compilat de procediments PL/SQL. També pot guardar dades d'usuari.
  • Tablespace Temporal: té les propietats que tindran els objectes que la base de dades crei temporalment per als seus càlculs interns (normalment per a ordenacions i agrupacions). La seva creació difereix en una de les seves clàusules.
  • Tablespace RO: és de només lectura (Read Only), i per tant tots els objectes en ell continguts poden rebre ordres de consulta de dades, però no de modificació de dades. Pot residir en suports de només lectura, com poden ser CDROMs, DVDs, etc.

Quan es crea un tablespace, aquest es crea de lectura/escriptura. Després es pot modificar perquè sigui de solament lectura. Un tablespace pot estar en línia o fora d'ella (Online o Offline), això és que tots els objectes continguts en ell estan a la disposició dels usuaris o estan inhabilitats per restringir el seu ús.

Datafile

  • Representació física d'un tablespace. Són els "fitxers de dades" on s'emmagatzema la informació físicament.
  • Pot tenir qualsevol nom i extensió (sempre dins de les limitacions del sistema operatiu), i pot estar localitzat en qualsevol directori del disc dur, encara que la seva localització típica sol ser $ORACLE_HOME/Database.
  • Té una grandària predefinida en la seva creació (per exemple 100Mb) i est pot ser alterat a qualsevol moment. Quan es crea, ocuparà tant espai en disc com hàgim indicat en la seva creació, encara que internament estigui buit. Oracle fa això per reservar espai continuu en disc i evitar així la fragmentació. Conforme es vagin creant objectes en aquest tablespace, s'anirà ocupant l'espai que va crear inicialment.
  • Està associat a un sol tablespace i, al seu torn, un tablespace està associat a un o diversos datafiles. És a dir, la relació lògica entre tablespaces i datafiles és d'1-N, mestre-detall.
Datafile

En l'esquema podem veure com el "Tablespace A" està compost (físicament) per tres datafiles (DADES_1.ORA, DADES_2.ORA i DADES_3.ORA). Aquests tres datafiles són els fitxers físics que suporten els objectes continguts dins del tablespace A. Encara que sempre es diu que els objectes estan dins del tablespace, en realitat les taules estan dins del datafile, però tenen la propietats associades al tablespace.

Cadascun dels datafiles utilitzats està ocupant la seva grandària en disc (50 Mb els dos primers i 25 Mb l'últim) encara que en realitat només continguin dos objectes i aquests objectes no omplin l'espai que està assignat pels datafiles.

Els datafiles tenen una propietat anomenada AUTOEXTEND, que se si està activa, s'encarrega que el datafile creixi automàticament (segons una grandària indicada) cada vegada que es necessiti espai i no existeixi. Igual que els tablespaces, els datafiles també pot estar en línia o fora d'ella.

Segment

Un segment és aquell espai reservat per la base de dades, dins d'un datafile, per ser utilitzat per un sol objecte. Així una taula (o qualsevol altre objecte) està dins del seu segment, i mai podrà sortir d'ell, ja que si la taula creix, el segment també creix amb ella. Físicament, tot objecte en base de dades no és més que un segment (segment, tros, secció) dins d'un datafile. Es pot dir que, un segment és a un objecte de base de dades, la qual cosa un datafile a un tablespace: el segment és la representació física de l'objecte en base de dades (l'objecte no és més que una definició lògica).

Segment

Podem veure com l'espai que realment s'ocupa dins del datafile és el segment i que cada segment pertany a un objecte.

Existeixen quatre tipus de segments (principalment):

  • Segments de TABLE: aquells que contenen taules
  • Segments d'INDEX: aquells que contenen índexs
  • Segments de ROLLBACK: aquells s'usen per emmagatzemar informació de la transacció activa.
  • Segments TEMPORALS: aquells que s'usen per realitzar operacions temporals que no poden realitzar-se en memòria, tals com a ordenacions o agrupacions de conjunts grans de dades.

Extent

Per a qualsevol objecte de base de dades que tingui certa ocupació en disc, és a dir, qualsevol objecte que tingui un segment relacionat, existeix el concepte d'extent. Extent és un espai de disc que es reserva d'una sola vegada, un segment que es reserva en un moment determinat de temps. El concepte d'extent és un concepte físic, uns estan separats d'uns altres dins del disc. Ja vam dir que tot objecte té el seu segment associat, però el que no vam dir és que aquest segment, al seu torn, es compon de diferents extensions. Un segment, pot ser reservat d'una sola vegada (10 Mb de cop), o de diverses vegades (5 Mb avui i 5 Mb demà). Cadascuna de les vegades que es reserva espai es denomina "extensió".

Extent

En l'esquema veiem com l'objecte (taula) FACTURA té un segment en el datafile A-1, i aquest segment està compost de 3 extensions. Una d'aquestes extensions té un color diferent. Això és perquè existeixen dos tipus d'extensions:

  • INITIAL (extensions inicials): aquestes són les extensions que es reserven durant la creació de l'objecte. Una vegada que un objecte està creat, no es pot modificar la seva extensió inicial.
  • NEXT (següents o subsegüents extensions): tota extensió reservada després de la creació de l'objecte. Si l'INITIAL EXTENT d'una taula està plena i s'està intentant inserir més files, s'intentarà crear un NEXT EXTENT (sempre que el datafile tingui espai lliure i tinguem quota d'ocupació suficient).

Sabent que les extensions es creen en moments diferents de temps, és lògic pensar que unes extensions poden estar fragmentades d'unes altres. Un objecte de base de dades no resideix tot junt dins del bloc, sinó que residirà en tants bloc com a extensions tingui. Per això és crític definir una bona grandària d'extensió inicial, ja que, si és prou gran, l'objecte mai estarà fragmentat.

Si l'objecte té moltes extensions i aquestes estan molt separades en disc, les consultes poden retardar-se considerablement, ja que els caps lectors has de donar salts constantment.

La grandària de les extensions (tant les INITIAL com les NEXT), es defineixen durant la creació de l'objecte i no pot ser modificat després de la creació. Oracle recomana que la grandària de l'INITIAL EXTENT sigui igual a la grandària del NEXT EXTENT.

La millor solució és calcular la grandària que tindrà l'objecte (taula o índex), multiplicant la grandària de cada fila per una estimació del nombre de files. Quan hem fet aquest càlcul, hem d'utilitzar aquesta grandària com a extensió INITIAL i NEXT, i tindrem pràcticament la certesa que no es va a produir fragmentació en aquest objecte. En cas de detectar més de 10 extensions en un objecte (consultant el catàleg d'Oracle, com veurem), hem de recrear l'objecte des de zero (aplicant el càlcul anterior) i importar de nou les dades.

Certes operacions, necessiten d'espai en disc per poder realitzar-se. L'espai reservat es denomina %o201Csegmentos temporals%o201D. Es poden crear segments temporals quan:

  • Es crea un índex
  • S'utilitza ORDER BY, DISTINTC o GROUP BY en un SELECT.
  • S'utilitzen els operadors UNION, INTERSECT o MINUS.
  • S'utilitzen joins entre taules.
  • S'utilitzen subconsultas.

Data block

Un data block és l'última baula dins de la cadena d'emmagatzematge. El concepte de Data block és un concepte físic, ja que representa la mínima unitat d'emmagatzematge que és capaç de manejar Oracle. Igual que la mínima unitat d'emmagatzematge d'un disc dur és la unitat d'assignació, la mínima unitat d'emmagatzematge d'Oracle és el data block. En un disc dur no és possible que un fitxer petit ocupi menys del que indiqui la unitat d'assignació, així si la unitat d'assignació és de 4 Kb, un fitxer que ocupi 1 Kb, en realitat ocupa 4 Kb.

Seguint amb la cadena, cada segment (o cada extensió) s'emmagatzema en un o diversos blocs de dades, depenent de la grandària definida per a l'extensió, i de la grandària definida pel data block.

Datablock

(*) Espai ocupat en el data block per la primera NEXT EXTENSION. (#) Espai ocupat en unitats d'assignació del sistema operatiu pels data blocks anteriors.

L'esquema mostra tota la cadena d'emmagatzematge d'Oracle.

Des del nivell més físic al més lògic:

  • Unitats d'assignació del sistema operatiu (El més físic. No depèn d'Oracle)
  • Data blocks d'Oracle
  • Extents
  • Segments
  • DataFiles
  • Tablespaces (El més lògic)

La grandària de les unitats d'assignació del sistema operatiu es defineix durant el particionado del disc dur (FDISK, FIPS...), i l'espai dels data blocks d'Oracle es defineix durant la instal·lació i no pot ser canviat.

Com és lògic, la grandària d'un data block ha de ser múltiple de la grandària d'una unitat d'assignació, és a dir, si cada unitat d'assignació ocupa 4 K, els data blocks poden ser de 4K, 8K, 12K... perquè en el sistema operatiu ocupin 1, 2, 3... unitats d'assignació.

Esquema extret de l'Oracle8 Concepts

Mida datablock

Estructures de memòria

Totes les estructura que hem vist es refereixen a com s'emmagatzemen les dades en el disc. No obstant això, i com és lògic, Oracle també utilitza la memòria del servidor per al seu funcionament. Oracle utilitza dos tipus de memòria

  • Memòria local i privada per a cadascun dels processos: PGA (Process Global Area o Program Global Area).
  • Memòria comuna i compartida per tots els processos SGA (System Global Area o Shared Global Area).

Cada vegada que es connecta un client al servidor, s'executa un subproceso que atendrà les seves peticions (a través del fork en Unix o amb CreateThread al món Windows), i aquest subprocès crearà un nou bloc de memòria de tipus PGA. La grandària d'aquest bloc de memòria dependrà del sistema operatiu, i roman invariable, encara que es pot configurar canviant el valor de la variable SORT_AREA_SIZE de l'arxiu d'inicialització INIT.ORA.

Per cada instància de base de dades, tindrem una zona de memòria global, el SGA, on s'emmagatzemen aquelles dades i estructures que han des compartits entre diferents processos de la base de dades, com els processos propis d'Oracle i cadascun dels subprocès que gestionen la connexió. La grandària del SGA és un dels punts més crítics a l'hora de millorar el rendiment d'una base de dades, ja que, com més gran memòria es reservi (mentre no sigui memòria virtual), més ràpides es realitzaran certes operacions. Per exemple, les ordenacions (una de les operacions que més ràpid han de fer-se) es realitzen en el SGA si hi ha espai suficient. En cas contrari, es realitzaran directament en el disc, utilitzant segments temporals.

El SGA es divideix en quatre grans zones:

  • Database buffer cache: emmagatzema els blocs que s'han llegit dels datafiles. Cada vegada que és necessari accedir a un bloc, es busca el bloc en aquesta zona, i en cas de no existir, es llegeix de nou del datafile corresponent. Quants més blocs càpiguen en aquesta zona de memòria, millor serà el rendiment.
  • SQL Area: és la zona de memòria s'emmagatzemen compilades les últimes sentències SQL (i blocs PL/SQL) executades. A més s'emmagatzemen les variables acoblades (bind), l'arbre de parsing, els buffer d'execució i el pla d'execució. És important que sempre que s'utilitzi la mateixa sentència, sigui exactament igual, per poder aprofitar sentències prèvies emmagatzemades en el SQL Area. És a dir, les següents sentències:

"SELECT * FROM TAULA", "select * from taula", "SELECT * FROM TAULA", "SELECT * FROM taula"

Es consideren diferents i no s'aprofita el SQL Area. Ha de coincidir el text exactament, considerant majúscules i minúscules, espais, tornades de carro, nom de paràmetres, etc. Això és a causa que es busquen dins del SQL Area utilitzant un hash de la sentència, i un simple espai (o canviar una lletra a majúscules) fa que el hash resultant sigui diferent, per la qual cosa no trobarà la sentència dins del SQL Area. Com més gran sigui l'espai del SQL Area, es realitzaran menys compilacions, plans d'execució i anàlisis lèxiques, per la qual cosa l'execució de les consultes serà més ràpida.

  • Redo cache: emmagatzema els registres de redo de les últimes operacions realitzades. Aquests registres s'emmagatzemen en els arxius de redo, que serveixen per recompondre la base de dades en cas d'error.
  • Dictionary cache: emmagatzema dades del diccionari d'Oracle, per utilitzar-los en els plans d'execució, optimització de consultes, etc. Quants més dades càpiguen en aquesta zona, major probabilitat haurà de que la dada que necessitem ja estigui en memòria, i no sigui necessari accedir a les taules del diccionari per llegir-ho.

Arxius d'inicialització

A més d'estructures de disc i de memòria, un servidor Oracle necessita certs arxius per poder executar-se. Aquests arxius s'estableixen durant la creació de la base de dades, i es consultaran cada vegada que s'arrenqui la base de dades, per la qual cosa han d'estar disponibles. Bàsicament podem diferencies els tipus d'arxius:

  • Control files: són arxius de control que es consulten cada vegada que s'arrenca la base de dades. Indica dades com la localització dels datafiles, nom de la base de dades.
  • Init file: és l'arxiu que conté els paràmetre d'inici de la base de dades (grandària del bloc, grandària del SGA, etc.). Normalment té el nom INIT.ORA
  • Redo logs: aquests arxius contenen un historial de totes les instruccions que han estat llançades a la base de dades, per poder recuperar-la en cas de fallada. No s'utilitzen durant la inicialització, sinó durant tota l'execució de la base de dades.