Estructuras de Oracle

Oracle almacena la informaci�n en unidades l�gicas que son los segmentos, las extensiones y los bloques. Estas tres unidades est�n relacionadas entre s�. Un segmento est� formado por una o varias extensiones y cada extensi�n est� formado por varios bloques.

Un bloque es la unidad m�nima de almacenamiento de informaci�n de Oracle. A los bloques tambi�n se les conoce como "bloques de datos", "bloques l�gicos" o "bloques oracle". Cada uno de estos bloques est� formado por un n�mero determinado de bloques del sistema operativo. A la hora de crear una nueva base de datos se debe indicar cu�ntos bloques de sistema operativo formar�n un bloque de datos o bloque oracle. Es muy importante decidir bien este valor de antemano ya que una vez creada la base de datos ya no se puede modificar m�s que en migraciones a versiones m�s actuales del producto.

Un bloque de datos es la m�nima unidad de Lectura / Escritura en una base de datos Oracle, es decir, Oracle no lee y escribe en bloques del sistema operativo sino que lo hace en unidades l�gicas que son los bloques de datos y que var�an de una base de datos a otra en la misma m�quina ya que es un valor que se debe indicar en la creaci�n de cada base de datos Oracle.

Oracle recomienda que el tama�o de un bloque de datos o, data block, sea siempre un m�ltiplo del bloque de datos del sistema operativo.

.�Estructura de un bloque

Los bloques de base de datos, pueden contener informaci�n de tablas, �ndices o segmentos de rollback, pero no importa qu� informaci�n contengan, siempre tienen la misma estructura, que es la mostrada en la siguiente figura.

Todo bloque de datos o, data block, est� dividido en una cabecera, en un directorio de tablas que utilizan dicho bloque, en un directorio de las filas que se encuentran almacenadas en ese bloque, de espacio a�n libre y de las filas de datos de las tablas, �ndices o segmentos de rollback. Al espacio ocupado por la cabecera m�s el directorio de tablas y m�s el directorio de filas se le llama overhead ya que es un espacio del bloque que realmente no se rellena con datos sino que est� ocupado por la informaci�n que necesita Oracle para saber exactamente qu� datos tiene en dicho bloque.

Cabecera:

Contiene informaci�n general sobre el bloque como el tipo de segmento al que pertenece (�ndice, tabla, rollback) o la direcci�n del bloque.

Directorio de Tablas:

Contiene informaci�n acerca de las tablas que tienen datos en el bloque.

Directorio de Filas:

Contiene informaci�n sobre las filas que se encuentran en cada momento en el bloque. Esta informaci�n incluye la direcci�n de la fila dentro de la subzona "Datos de Filas" del bloque en la que debe buscar Oracle los datos.

El espacio ocupado por esta subzona va aumentando a medida que se insertan nuevas filas en el bloque, sin embargo nunca se libera el espacio. Si se borran filas de datos que estaban en el bloque, en el directorio de filas desaparecer� la entrada que apuntaba a ellas, pero el espacio permanecer� reservado aunque vac�o. A medida que se insertan nuevas filas de datos en el bloque, tambi�n se insertan registros en el Directorio de Filas, pero antes de aumentar el tama�o de esta subzona para la nueva entrada, se comprueba si alguna de las entradas que hay est� vac�a y en ese caso se "ocupa" y no hace falta que crezca m�s la subzona.

Espacio Libre:

Esta subzona est� reservada para la inserci�n de nuevas filas en el bloque o, para la modificaci�n de campos que requieren m�s espacio que el que ten�an con anterioridad. Esto �ltimo ocurre, por ejemplo, con los campos que son de tipo varchar2. Si en un campo de una tabla tenemos un varchar2 de 30 caracteres para almacenar el nombre del empleado, si insertamos un registro con el nombre de 'Jesus', solo ocupa 5 bytes y si posteriormente lo modificamos para poner 'Jesus Maria', se necesitar�n 6 bytes m�s para almacenarlo.

Si en el bloque se est�n almacenando datos de segmentos de tipo tabla o �ndice, en la subzona de Espacio Libre tambi�n se utiliza para llevar un registro de las transacciones que en cada momento acceden a datos del bloque. Se necesita una entrada de transacci�n siempre que se realice una insert, update, delete o select for update sobre filas del bloque. El tama�o necesario para cada una de las entradas de transacciones depende del sistema operativo.

Datos de Filas:

En esta subzona se almacenan los datos de las tablas o de los �ndices del bloque. Se puede dar el caso de que una fila no entre completa en el bloque y tenga que ocupar m�s de un bloque. Este caso especial se comentar� m�s a fondo en el apartado de encadenamiento y migraci�n de filas.

.�Pctfree

Este par�metro se utiliza para modificar el comportamiento de Oracle a la hora de insertar y modificar filas dentro de un bloque de datos o data block, se asigna a la hora de crear la tabla o �ndice. Tambi�n se puede modificar posteiormente el valor del pctfree alterando la tabla o el �ndice.

Este par�metro indica el porcentaje m�nimo que se debe dejar libre para modificaciones de los datos de las filas que ya existen dentro del bloque. Hay que tener en cuenta que el espacio de un bloque no est� compuesto solamente por los datos, sino que tambi�n hay un overhead, por lo que si asignamos a un segmento de tipo tabla un pctfree de 20, no estamos dejando para insercciones el 80% sino el 80% menos lo que ocupe el overhead del bloque.

El concepto de pctfree se entiende mejor con un ejemplo. Si a una tabla le asignamos un pctfree de 20, le estamos diciendo que se pueden insertar filas en el hasta que quede libre en dicho bloque solamente el 20 por ciento. A partir de ese instante, todas las filas nuevas que se creen se crear�n en otros bloques ya que en este ya no queda sitio para m�s. Entonces, �qu� ocurre con este 20%?. Pues muy sencillo, se utiliza para las modificaciones de las filas que ya est�n en el bloque. Cuando se modifica una fila y se aumenta el contenido de un campo, por ejemplo, el campo "nombre" ten�a el valor 'Jesus' y ahora pasa a tener el valor 'Jesus Maria', Oracle echa mano del espacio libre dentro del bloque para poder realizar esta operaci�n.

Por lo tanto, este espacio podr�a incluso llenarse lo cual, en caso de seguir haciendo modificaciones de este estilo, podr�a generarnos filas migradas, como se explica m�s adelante. Sin embargo, el espacio libre en un bloque tambi�n puede aumentar, bien borrando filas o bien haciendo updates que disminuyan el valor de los campos de las filas que existen en dicho bloque. Cuando se hace espacio libre suficiente en el bloque se permite otra vez la insercci�n de registros en el mismo. El concepto de "espacio libre suficiente" para volver a permitir inserciones en el bloque es lo que se define con el par�metro pctused.

.�Pctused

El concepto de pctused est� directamente relacionado con pctfree. Supongamos que se crea un segmento (tabla o �ndice) y se le asigna un pcfree de 20, por lo que todos sus bloques tendr�n dicho pctfree. Como ya hemos explicado, esto quiere decir que podremos insertar filas o registros en uno de sus bloques hasta que se llene al 80 por ciento. A partir de ese momento ya no se pueden insertar nuevos registros hasta que se libere espacio en el bloque, o sea, hasta que vuelva a aumentar el espacio libre.

Llegados a este punto nos hacemos 2 preguntas:

  • �Qu� hay que hacer para que aumente el espacio libre en un bloque?. Muy sencillo, o bien borrar las filas que est�n en �l o bien modificando campos de esas filas disminuyendo el tama�o de los valores que en ellas est�n guardados.
  • �Cuanto espacio libre tiene que haber para poder volver a insertar nuevas filas?. Este valor nos lo indica el par�metro pctused.
As�, si a un bloque le hemos asignado un pctused de 40, lo que conseguimos es que en un bloque no se puedan insertar nuevos registros (despu�s de haberse llenado hasta dejar solamente el pctincrease de espacio libre) hasta que el espacio ocupado por las filas en dicho bloque no baje por debajo de 40, es decir, que el pctused nos indica el l�mite m�nimo por debajo del cual debe bajar el espacio ocupado dentro del bloque antes de volver a estar disponible para aceptar nuevas filas, nuevas inserciones. Hay que resaltar que en los bloques de los segmentos de tipo �ndice, no tiene utilidad el par�metro pctused debido a la finalidad de los mismos y a su estructura interna en forma de �rbol binario.

Para consultar el valor tanto del par�metro pctfree como del par�metro pctused de cada segmento de tipo tabla o de tipo �ndice, podemos leer las vistas dba_tables y dba_indexes del usuario SYS.

Select owner, table_name, pct_free, pct_used from dba_tables; 
Select owner, index_name, pct_free from dba_indexes; 

Para modificar el valor de los par�metros de una tabla o de un �ndice se pueden utilizar las siguientes sentencias:

Alter table nombre_de_tabla  pctfree nuevo_pct_free; 
Alter table nombre_de_tabla pctused nuevo_pct_used; 
Alter index nombre_de_indice pctfree nuevo_pct_free; 

.�Encadenamiento y Migraci�n de Filas

Existen dos circunstancias diferentes por las cuales puede ocurrir que los datos de una fila reci�n insertada no tengan espacio suficiente dentro del bloque. Hay que intentar por todos los medios evitar que esto se produzca para que no caiga el rendimiento del sistema ya que cuando hay encadenamiento o migracion de filas, los datos de una fila se dispersan por varios bloques, con lo que para obtener esos datos o para modificarlos Oracle debe recorrer varios bloques que, posiblemente, no est�n contiguos.

Encadenamiento de filas:

El encadenamiento o chained rows, se da cuando los datos de una fila ocupan tanto espacio que no caben f�sicamente en un solo bloque y Oracle debe guardarlos en dos o m�s bloques de los reservados para ese segmento. Esto suele ocurrir generalmente cuando se utilizan columnas de tipo long o long raw que pueden almacenar grandes cantidades de espacio, por lo que no caben en un solo bloque.

Migraci�n de filas

Este otro caso se da cuando modificamos los datos de una fila de un bloque, aument�ndolos de tama�o, es decir, como en le ejemplo anterior, si ten�amos un campo varchar2(30) con el valor 'Jesus' solo ocupaba 5 bytes y si lo modificamos para que contenga 'Jesus Maria' necesita 11 bytes. En este caso, si en la subzona en la que tenemos el espacio libre del bloque no disponemos de espacio suficiente, Oracle mueve o mejor dicho, migra toda la fila a un nuevo bloque en el que si que haya espacio para toda la fila. Sin embargo, para no tener que cambiarle a dicha fila el rowid, es decir, el identificador �nico de la fila, lo que se hace es dejar en el bloque inicial una informaci�n m�nima de la fila, que ser� simplemente un puntero hacia la direcci�n del nuevo bloque en el que se ha reubicado toda esta fila.

.�Temas Relacionados

Relacionado directamente con este tema, se pueden estudiar tambi�n los siguientes temas:

  • �Qu� tama�o de data block se debe elegir?.
  • �Qu� es y c�mo influye el par�metro db_file_multi_block_read_count?.
  • �Qu� valor de Pctfree y Pctused se debe dar a cada tabla e �ndice?.
  • �Qu� son las freelist y qu� es la contenci�n de las freelists?.
  • �C�mo detectar las filas encadenadas o migradas?.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO