Diferència entre revisions de la pàgina «M2 - Bases de dades / Continguts UF3: Emmagatzemament»

De wikiserver
Dreceres ràpides: navegació, cerca
(Estructuras de memoria)
 
(Hi ha 26 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
==Tablespace (espacio de tablas) ==
+
==Tablespace==
  
Una base de datos se divide en unidades lógicas denominadas TABLESPACES. Un tablespace no es un fichero físico en el disco, simplemente es el nombre que tiene un conjunto de propiedades de almacenamiento que se aplican a los objetos (tablas, secuencias…) que se van a crear en la base de datos bajo el tablespace indicado (tablas, secuencias…).
+
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 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 objeto en base de datos debe estar almacenado obligatoriamente dentro de un tablespace.'''
+
'''Un objecte de la base de dades ha d'estar emmagatzemat obligatòriament dins d'un tablespace.'''
  
Las propiedades que se asocian a un tablespace son:
+
Les propietats que s'associen a un tablespace són:
  
:*Localización de los ficheros de datos.
+
:*Localització dels fitxers de dades.
:*Especificación de máximas cuotas de consumo de disco.
+
:*Especificació de màximes quotes de consum de disc.
:*Control de la disponibilidad de los datos (en línea o fuera de línea).
+
:*Control de la disponibilitat de les dades (en línia o fora de línia).
:*Backup de datos.
+
:*Backup de dades.
  
Cuando un objeto se crea dentro de un cierto tablespace, este objeto adquiere todas las propiedades antes descritas del tablespace utilizado.
+
Quan un objecte es crea dins d'un cert tablespace, aquest objecte adquireix totes les propietats abans descrites del tablespace utilitzat.
  
[[Imatge:m2_UF2_tablespace.png |400px|center| Tablespace]]
+
[[Imatge:m2_UF2_tablespace.png |450px|center| Tablespace]]
  
En este esquema podemos ver que, por ejemplo, la tabla ARTICULO se almacena dentro del tablespace A, y que por lo tanto tendrá todas las propiedades del tablespace A que pueden ser:
+
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::
  
:*Sus ficheros de datos están en $ORACLE_HOME/datos/datos_tablespace_A
+
:*Els seus fitxers de dades estan en $ORACLE_HOME/dades/dades_tablespace_A
:*Los objetos no pueden ocupar más de 10Mb de espacio de base de datos.
+
:*Els objectes no poden ocupar més de 10Mb d'espai de base de dades.
:*En cualquier momento se puede poner fuera de línea todos los objeto de un cierto tablespace. -Se pueden hacer copiar de seguridad sólo de ciertos tablespaces.
+
:*A qualsevol moment es pot posar fora de línia tots els objecte d'un cert tablespace.  
  
Si nos fijamos, se puede apreciar que es posible tener una tabla en un tablespace, y los índices de esa tabla en otro. Esto es debido a que los índices no son más que objetos independientes dentro de la base de datos, como lo son las tablas. Y al ser objetos independientes, pueden ir en tablespaces independientes. El tablespace SYSTEM es uno de los que se crear por defecto en todas las bases de datos Oracle. En él se almacenan todos los datos de sistema, el catálogo y todo el código fuente y compilado de procedimientos PL/SQL. También es posible utilizar el mismo tablespace para guardar datos de usuario. En el esquema también vemos que hay un tablespace Temporal (en gris oscuro). Este representa las propiedades que tendrán los objetos que la base de datos cree temporalmente para sus cálculos internos (normalmente para ordenaciones y agrupaciones). Su creación difiere en una de sus cláusulas de creación. El tablespace RO (en gris claro) difiere de los demás en que es de solo lectura (Read Only), y que por lo tanto todos los objetos en él contenidos pueden recibir órdenes de consulta de datos, pero no de modificación de datos. Estos puede residir en soportes de sólo lectura, como pueden ser CDROMs, DVDs, etc. Cuando se crea un tablespace, éste se crea de lectura/escritura. Después se puede modificar para que sea de solo lectura. Un tablespace puede estar en línea o fuera de ella (Online o OffLine), esto es que todos los objetos contenidos en él están a disposición de los usuarios o están inhabilitados para restringir su uso. Cualquier objeto almacenado dentro de un tablespace no podrá ser accedido si este está fuera de línea.
+
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.  
  
==Concepto de Datafile (fichero de datos)==
+
:*'''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.
  
Un datafile es la representación física de un tablespace. Son los "ficheros de datos" donde se almacena la información físicamente. Un datafile puede tener cualquier nombre y extensión (siempre dentro de las limitaciones del sistema operativo), y puede estar localizado en cualquier directorio del disco duro, aunque su localización típica suele ser $ORACLE_HOME/Database. Un datafile tiene un tamaño predefinido en su creación (por ejemplo 100Mb) y este puede ser alterado en cualquier momento. Cuando creemos un datafile, este ocupará tanto espacio en disco como hayamos indicado en su creación, aunque internamente esté vacío. Oracle hace esto para reservar espacio continuo en disco y evitar así la fragmentación. Conforme se vayan creando objetos en ese tablespace, se irá ocupando el espacio que creó inicialmente.
+
:*'''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.  
  
Un datafile está asociado a un solo tablespace y, a su vez, un tablespace está asociado a uno o varios datafiles. Es decir, la relación lógica entre tablespaces y datafiles es de 1-N, maestro-detalle.
+
:*'''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.
  
 
[[Imatge:m2_UF2_datafile.png |400px|center| Datafile]]
 
[[Imatge:m2_UF2_datafile.png |400px|center| Datafile]]
  
En el esquema podemos ver como el “Tablespace A” está compuesto (físicamente) por tres datafiles (DATOS_1.ORA, DATOS_2.ORA y DATOS_3.ORA). Estos tres datafiles son los ficheros físicos que soportan los objetos contenidos dentro del tablespace A. Aunque siempre se dice que los objetos están dentro del tablespace, en realidad las tablas están dentro del datafile, pero tienen la propiedades asociadas al tablespace.
+
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.
  
Cada uno de los datafiles utilizados está ocupando su tamaño en disco (50 Mb los dos primeros y 25 Mb el último) aunque en realidad sólo contengan dos objetos y estos objetos no llenen el espacio que está asignado para los datafiles.
+
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.
  
Los datafiles tienen una propiedad llamada AUTOEXTEND, que se si está activa, se encarga de que el datafile crezca automáticamente (según un tamaño indicado) cada vez que se necesite espacio y no exista. Al igual que los tablespaces, los datafiles también puede estar en línea o fuera de ella.
+
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.
  
==Concepto de Segment (segmento, trozo, sección)==
+
==Segment==
  
Un segment es aquel espacio reservado por la base de datos, dentro de un datafile, para ser utilizado por un solo objeto. Así una tabla (o cualquier otro objeto) está dentro de su segmento, y nunca podrá salir de él, ya que si la tabla crece, el segmento también crece con ella. Físicamente, todo objeto en base de datos no es más que un segmento (segmento, trozo, sección) dentro de un datafile. Se puede decir que, un segmento es a un objeto de base de datos, lo que un datafile a un tablespace: el segmento es la representación física del objeto en base de datos (el objeto no es más que una definición lógica).
+
:*Espai reservat per la base de dades, dins d'un datafile, per ser utilitzat per un sol objecte.  
  
[[Imatge:m2_UF2_segment.png |400px|center| Segment]]
+
:*Els objectes sempre estan dins del seu segment, si creixen el segment creix amb ells.
  
Podemos ver cómo el espacio que realmente se ocupa dentro del datafile es el segment y que cada segmento pertenece a un objeto.
+
:*Físicament, tot objecte en base de dades no és més que un segment dins d'un datafile.  
  
Existen cuatro tipos de segmentos (principalmente):
+
[[Imatge:m2_UF2_segment.png |400px|center| Segment]]
  
:*Segmentos de TABLE: aquellos que contienen tablas
+
Podem veure com l'espai que realment s'ocupa dins del datafile és el segment i que cada segment pertany a un objecte.
:*Segmentos de INDEX: aquellos que contienen índices
 
:*Segmentos de ROLLBACK: aquellos se usan para almacenar información de la transacción activa.
 
:*Segmentos TEMPORALES: aquellos que se usan para realizar operaciones temporales que no pueden realizarse en memoria, tales como ordenaciones o agrupaciones de conjuntos grandes de datos.
 
  
==Concepto de Extent (extensión)==
+
Existeixen quatre tipus de segments (principalment):
  
Para cualquier objeto de base de datos que tenga cierta ocupación en disco, es decir, cualquier objeto que tenga un segment relacionado, existe el concepto de extent. Extent es un espacio de disco que se reserva de una sola vez, un segmento que se reserva en un momento determinado de tiempo. El concepto de extent es un concepto físico, unos están separados de otros dentro del disco. Ya dijimos que todo objeto tiene su segmento asociado, pero lo que no dijimos es que este segmento, a su vez, se compone de distintas extensiones. Un segmento, puede ser reservado de una sola vez (10 Mb de golpe), o de varias veces (5 Mb hoy y 5 Mb mañana). Cada una de las veces que se reserva espacio se denomina “extensión”.
+
:*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.
  
[[Imatge:m2_UF2_extent.png |400px|center| Extent]]
+
==Extent==
  
En el esquema vemos como el objeto (tabla) FACTURA tiene un segmento en el datafile A-1, y este segmento está compuesto de 3 extensiones. Una de estas extensiones tiene un color distinto. Esto es porque existen dos tipos de extensiones:
+
:*És un espai de disc que es reserva d'una sola vegada per a un segment. 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ó".
  
:*INITIAL (extensiones iniciales): estas son las extensiones que se reservan durante la creación del objeto. Una vez que un objeto está creado, no se puede modificar su extensión inicial.
+
:*El concepte d'extent és un concepte físic, uns estan separats d'uns altres dins del disc.  
  
:*NEXT (siguientes o subsiguientes extensiones): toda extensión reservada después de la creación del objeto. Si el INITIAL EXTENT de una tabla está llena y se está intentando insertar más filas, se intentará crear un NEXT EXTENT (siempre y cuando el datafile tenga espacio libre y tengamos cuota de ocupación suficiente).
+
[[Imatge:m2_UF2_extent.png |400px|center| Extent]]
  
Sabiendo que las extensiones se crean en momentos distintos de tiempo, es lógico pensar que unas extensiones pueden estar fragmentadas de otras. Un objeto de base de datos no reside todo junto dentro del bloque, sino que residirá en tantos bloque como extensiones tenga. Por eso es crítico definir un buen tamaño de extensión inicial, ya que, si es lo suficientemente grande, el objeto nunca estará fragmentado.
+
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:
  
Si el objeto tiene muchas extensiones y éstas están muy separadas en disco, las consultas pueden retardarse considerablemente, ya que las cabezas lectoras tienes que dar saltos constantemente.
+
:*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).
  
El tamaño de las extensiones (tanto las INITIAL como las NEXT), se definen durante la creación del objeto y no puede ser modificado después de la creación. Oracle recomienda que el tamaño del INITIAL EXTENT sea igual al tamaño del NEXT EXTENT.
+
El fet que les extensions es creen en moments diferents de temps, provoca fragmentació. Un objecte residirà en tants blocs 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 mejor solución es calcular el tamaño que tendrá el objeto (tabla o índice), multiplicando el tamaño de cada fila por una estimación del número de filas. Cuando hemos hecho este cálculo, debemos utilizar este tamaño como extensión INITIAL y NEXT, y tendremos prácticamente la certeza de que no se va a producir fragmentación en ese objeto. En caso de detectar más de 10 extensiones en un objeto (consultando el catálogo de Oracle, como veremos), debemos recrear el objeto desde cero (aplicando el cálculo anterior) e importar de nuevo los datos.
+
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 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.
  
Ciertas operaciones, necesitan de espacio en disco para poder realizarse. El espacio reservado se denomina “segmentos temporales”. Se pueden crear segmentos temporales cuando:
+
Certes operacions, necessiten d'espai en disc per poder realitzar-se. L'espai reservat es denomina "segments temporal". Es poden crear segments temporals quan:
  
:*Se crea un índice
+
:*Es crea un índex
:*Se utiliza ORDER BY, DISTINTC o GROUP BY en un SELECT.
+
:*S'utilitza ORDER BY, DISTINCT o GROUP BY en un SELECT.
:*Se utilizan los operadores UNION, INTERSECT o MINUS.
+
:*S'utilitzen els operadors UNION, INTERSECT o MINUS.
:*Se utilizan joins entre tablas.
+
:*S'utilitzen joins entre taules.
:*Se utilizan subconsultas.
+
:*S'utilitzen subconsultas.
  
==Concepto de Data block (bloque de datos)==
+
==Data block==
  
Un data block es el último eslabón dentro de la cadena de almacenamiento. El concepto de Data block es un concepto físico, ya que representa la mínima unidad de almacenamiento que es capaz de manejar Oracle. Igual que la mínima unidad de almacenamiento de un disco duro es la unidad de asignación, la mínima unidad de almacenamiento de Oracle es el data block. En un disco duro no es posible que un fichero pequeño ocupe menos de lo que indique la unidad de asignación, así si la unidad de asignación es de 4 Kb, un fichero que ocupe 1 Kb, en realidad ocupa 4 Kb.
+
:*És un concepte físic, ja que representa la mínima unitat d'emmagatzematge que és capaç de manegar Oracle.  
  
 +
:*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.
  
Siguiendo con la cadena, cada segmento (o cada extensión) se almacena en uno o varios bloques de datos, dependiendo del tamaño definido para el extensión, y del tamaño definido para el data block.
+
:*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.
  
 
[[Imatge:m2_UF2_datablock.png |400px|center| Datablock]]
 
[[Imatge:m2_UF2_datablock.png |400px|center| Datablock]]
  
(*) Espacio ocupado en el data block por la primera NEXT EXTENSION. (#) Espacio ocupado en unidades de asignación del sistema operativo por los data blocks anteriores.
+
(*) Espai ocupat en el data block per la primera NEXT EXTENSION. (#) Espai ocupat en unitats d'assignació del sistema operatiu pels data blocks anteriors.
  
El esquema muestra toda la cadena de almacenamiento de Oracle.
+
L'esquema mostra tota la cadena d'emmagatzematge d'Oracle.
  
Desde el nivel más físico al más lógico:
+
Des del nivell més físic al més lògic:
  
:*Unidades de asignación del sistema operativo (El más físico. No depende de Oracle)
+
:*Unitats d'assignació del sistema operatiu (El més físic. No depèn d'Oracle)
:*Data blocks de Oracle
+
:*Data blocks d'Oracle
 
:*Extents
 
:*Extents
 
:*Segments
 
:*Segments
 
:*DataFiles
 
:*DataFiles
:*Tablespaces (El más lógico)
+
:*Tablespaces (El més lògic)
 +
 
 +
La grandària de les unitats d'assignació del sistema operatiu es defineix durant el particionat 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
 +
 
 +
[[Imatge:m2_UF2_mida_datablock.png |200px|center| Mida datablock]]
  
El tamaño de las unidades de asignación del sistema operativo se define durante el particionado del disco duro (FDISK, FIPS…), y el espacio de los data blocks de Oracle se define durante la instalación y no puede ser cambiado.
+
==Estructures de memòria==
  
 +
Oracle utilitza dos tipus de memòria:
  
Como es lógico, el tamaño de un data block tiene que ser múltiplo del tamaño de una unidad de asignación, es decir, si cada unidad de asignación ocupa 4 K, los data blocks pueden ser de 4K, 8K, 12K… para que en el sistema operativo ocupen 1, 2, 3… unidades de asignación.
+
:*Memòria local i privada per a cadascun dels processos: PGA (Process Global Area o Program Global Area).
  
Esquema extraído del Oracle8 Concepts
+
:*Memòria comuna i compartida per tots els processos SGA (System Global Area o Shared Global Area).
  
[[Imatge:m2_UF2_mida_datablock.png |400px|center| Mida datablock]]
+
Cada vegada que es connecta un client al servidor, s'executa un subprocés que atendrà les seves peticions, 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.
  
==Estructuras de memoria==
+
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 de compartir entre diferents processos de la base de dades, com els processos propis d'Oracle i cadascun dels subprocessos que gestionen la connexió.
  
Todas las estructura que hemos visto se refieren a cómo se almacenan los datos en el disco. Sin embargo, y como es lógico, Oracle también utiliza la memoria del servidor para su funcionamiento. Oracle utiliza dos tipos de memoria
+
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.
  
:*Memoria local y privada para cada uno de los procesos: PGA (Process Global Area o Program Global Area).
+
El SGA es divideix en quatre grans zones:
  
:*Memoria común y compartida por todos los procesos SGA (System Global Area o Shared Global Area).
+
:*'''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.
  
Cada vez que se conecta un cliente al servidor, se ejecuta un subproceso que atenderá sus peticiones (a través del fork en Unix o con CreateThread en el mundo Windows), y este subproceso creará un nuevo bloque de memoria de tipo PGA. El tamaño de este bloque de memoria dependerá del sistema operativo, y permanece invariable, aunque se puede configurar cambiando el valor de la variable SORT_AREA_SIZE del archivo de inicialización INIT.ORA.
+
:*'''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:
  
Por cada instancia de base de datos, tendremos una zona de memoria global, el SGA, donde se almacenan aquellos datos y estructuras que deben se compartidos entre distintos procesos de la base de datos, como los procesos propios de Oracle y cada uno de los subprocesos que gestionan la conexión. El tamaño del SGA es uno de los puntos más críticos a la hora de mejorar el rendimiento de una base de datos, ya que, cuanto mayor memoria se reserve (mientras no sea memoria virtual), más rápidas se realizarán ciertas operaciones. Por ejemplo, las ordenaciones (una de las operaciones que más rápido deben hacerse) se realizan en el SGA si hay espacio suficiente. En caso contrario, se realizarán directamente en el disco, utilizando segmentos temporales.
+
"SELECT * FROM TAULA", "select * from taula", "SELECT * FROM TAULA", "SELECT * FROM taula"
  
El SGA se divide en cuatro grandes zonas:
+
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.
  
:*'''Database buffer cache''': almacena los bloques que se han leído de los datafiles. Cada vez que es necesario acceder a un bloque, se busca el bloque en esta zona, y en caso de no existir, se lee de nuevo del datafile correspondiente. Cuantos más bloques quepan en esta zona de memoria, mejor será el rendimiento.
+
:*'''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.
  
:*'''SQL Area:''' es la zona de memoria se almacenan compiladas las últimas sentencias SQL (y bloques PL/SQL) ejecutadas. Además se almacenan las variables acopladas (bind), el árbol de parsing, los buffer de ejecución y el plan de ejecución. Es importante que siempre que se utilice la misma sentencia, sea exactamente igual, para poder aprovechar sentencias previas almacenadas en el SQL Area. Es decir, las siguientes sentencias:
+
:*'''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.
  
“SELECT * FROM TABLA”
+
==Arxius d'inicialització==
  
“select * from tabla” “SELECT * FROM TABLA” “SELECT * FROM tabla”
+
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:
  
Se consideran distintas y no se aprovecha el SQL Area. Debe coincidir el texto exactamente, considerando mayúsculas y minúsculas, espacios, retornos de carro, nombre de parámetros, etc. Esto es debido a que se buscan dentro del SQL Area utilizando un hash de la sentencia, y un simple espacio (o cambiar una letra a mayúsculas) hace que el hash resultante sea distinto, por lo que no encontrará la sentencia dentro del SQL Area. Cuanto mayor sea el espacio del SQL Area, se realizarán menos compilaciones, planes de ejecución y análisis léxicos, por lo que la ejecución de las consultas será más rápida.
+
:*'''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.
  
:*'''Redo cache:''' almacena los registros de redo de las últimas operaciones realizadas. Estos registros se almacenan en los archivos de redo, que sirven para recomponer la base de datos en caso de error.
+
:*'''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
  
:*'''Dictionary cache:''' almacena datos del diccionario de Oracle, para utilizarlos en los planes de ejecución, optimización de consultas, etc. Cuantos más datos quepan en esta zona, mayor probabilidad habrá de que el dato que necesitamos ya esté en memoria, y no sea necesario acceder a las tablas del diccionario para leerlo.
+
:*'''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.
  
==Archivos de inicialización==
+
==Exemples==
  
Además de estructuras de disco y de memoria, un servidor Oracle necesita ciertos archivos para poder ejecutarse. Estos archivos se establecen durante la creación de la base de datos, y se consultarán cada vez que se arranque la base de datos, por lo que deben estar disponibles. Básicamente podemos diferencias los tipos de archivos:
+
Crea tablespace amb el datafile tbs_perm_01.dat de 20MB.
 +
<pre>
 +
CREATE TABLESPACE tbs_perm_01
 +
DATAFILE 'tbs_perm_01.dbf'
 +
SIZE 20M;
 +
</pre>
  
:*'''Control files:''' son archivos de control que se consultan cada vez que se arranca la base de datos. Indica datos como la localización de los datafiles, nombre de la base de datos.
+
Crea tbs_perm_02 amb el datafile tbs_perm_02.dbf, amb extensions automàtiques de 10MB fins un màxim de 200MB.
 +
<pre>
 +
CREATE TABLESPACE tbs_perm_02
 +
DATAFILE 'tbs_perm_02.dat'
 +
SIZE 10M
 +
REUSE
 +
AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
 +
</pre>
  
:*'''Init file:''' es el archivo que contiene los parámetro de inicio de la base de datos (tamaño del bloque, tamaño del SGA, etc.). Normalmente tiene el nombre INIT.ORA
+
Afegeix el datafile prueba2.dbf al tablespace tbprueba, amb una mida de 5MB. amb extensions automàtiques de 1MB fins un màxim de 100MB.
 +
<pre>
 +
ALTER TABLESPACE tbprueba
 +
ADD datafile 'prueba2.dbf'
 +
SIZE 5M
 +
AUTOEXTEND ON NEXT 1M
 +
MAXSIZE 100M;
 +
</pre>
  
:*'''Redo logs:''' estos archivos contienen un historial de todas las instrucciones que han sido lanzadas a la base de datos, para poder recuperarla en caso de fallo. No se utilizan durante la inicialización, sino durante toda la ejecución de la base de datos.
+
Crea un tablespace anomenat CONTA amb el datafile CONTA_10.dbf de 300MB i deixa que els extents dels objectes es gestionin automàticament.
 +
<pre>
 +
CREATE TABLESPACE CONTA
 +
DATAFILE 'CONTA_01.dbf' SIZE 300M
 +
EXTENT MANAGEMENT LOCAL
 +
SEGMENT SPACE MANAGEMENT AUTO;
 +
</pre>

Revisió de 21:19, 7 feb 2020

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

  • Espai reservat per la base de dades, dins d'un datafile, per ser utilitzat per un sol objecte.
  • Els objectes sempre estan dins del seu segment, si creixen el segment creix amb ells.
  • Físicament, tot objecte en base de dades no és més que un segment dins d'un datafile.
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

  • És un espai de disc que es reserva d'una sola vegada per a un segment. 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ó".
  • El concepte d'extent és un concepte físic, uns estan separats d'uns altres dins del disc.
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).

El fet que les extensions es creen en moments diferents de temps, provoca fragmentació. Un objecte residirà en tants blocs 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 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 "segments temporal". Es poden crear segments temporals quan:

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

Data block

  • És un concepte físic, ja que representa la mínima unitat d'emmagatzematge que és capaç de manegar Oracle.
  • 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.
  • 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 particionat 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

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 subprocés que atendrà les seves peticions, 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 de compartir entre diferents processos de la base de dades, com els processos propis d'Oracle i cadascun dels subprocessos 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.

Exemples

Crea tablespace amb el datafile tbs_perm_01.dat de 20MB.

CREATE TABLESPACE tbs_perm_01
DATAFILE 'tbs_perm_01.dbf' 
SIZE 20M;

Crea tbs_perm_02 amb el datafile tbs_perm_02.dbf, amb extensions automàtiques de 10MB fins un màxim de 200MB.

CREATE TABLESPACE tbs_perm_02
DATAFILE 'tbs_perm_02.dat' 
SIZE 10M
REUSE
AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

Afegeix el datafile prueba2.dbf al tablespace tbprueba, amb una mida de 5MB. amb extensions automàtiques de 1MB fins un màxim de 100MB.

ALTER TABLESPACE tbprueba
ADD datafile 'prueba2.dbf'
SIZE 5M
AUTOEXTEND ON NEXT 1M
MAXSIZE 100M;

Crea un tablespace anomenat CONTA amb el datafile CONTA_10.dbf de 300MB i deixa que els extents dels objectes es gestionin automàticament.

CREATE TABLESPACE CONTA
DATAFILE 'CONTA_01.dbf' SIZE 300M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;