Estructuras de Oracle

Oracle almacena la informacin en unidades lgicas que son los segmentos, las extensiones y los bloques. Estas tres unidades estn relacionadas entre s. Un segmento est formado por una o varias extensiones y cada extensin est formado por varios bloques.

Un bloque es la unidad mnima de almacenamiento de informacin de Oracle. A los bloques tambin se les conoce como "bloques de datos", "bloques lgicos" o "bloques oracle". Cada uno de estos bloques est formado por un nmero determinado de bloques del sistema operativo. A la hora de crear una nueva base de datos se debe indicar cuntos bloques de sistema operativo formarn 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 ms que en migraciones a versiones ms actuales del producto.

Un bloque de datos es la mnima 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 lgicas que son los bloques de datos y que varan de una base de datos a otra en la misma mquina ya que es un valor que se debe indicar en la creacin de cada base de datos Oracle.

Oracle recomienda que el tamao de un bloque de datos o, data block, sea siempre un mltiplo del bloque de datos del sistema operativo.

.Estructura de un bloque

Los bloques de base de datos, pueden contener informacin de tablas, ndices o segmentos de rollback, pero no importa qu informacin 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 an libre y de las filas de datos de las tablas, ndices o segmentos de rollback. Al espacio ocupado por la cabecera ms el directorio de tablas y ms 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 informacin que necesita Oracle para saber exactamente qu datos tiene en dicho bloque.

Cabecera:

Contiene informacin general sobre el bloque como el tipo de segmento al que pertenece (ndice, tabla, rollback) o la direccin del bloque.

Directorio de Tablas:

Contiene informacin acerca de las tablas que tienen datos en el bloque.

Directorio de Filas:

Contiene informacin sobre las filas que se encuentran en cada momento en el bloque. Esta informacin incluye la direccin 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 vaco. A medida que se insertan nuevas filas de datos en el bloque, tambin se insertan registros en el Directorio de Filas, pero antes de aumentar el tamao de esta subzona para la nueva entrada, se comprueba si alguna de las entradas que hay est vaca y en ese caso se "ocupa" y no hace falta que crezca ms la subzona.

Espacio Libre:

Esta subzona est reservada para la insercin de nuevas filas en el bloque o, para la modificacin de campos que requieren ms espacio que el que tenan 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 necesitarn 6 bytes ms para almacenarlo.

Si en el bloque se estn almacenando datos de segmentos de tipo tabla o ndice, en la subzona de Espacio Libre tambin se utiliza para llevar un registro de las transacciones que en cada momento acceden a datos del bloque. Se necesita una entrada de transaccin siempre que se realice una insert, update, delete o select for update sobre filas del bloque. El tamao 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 ms de un bloque. Este caso especial se comentar ms a fondo en el apartado de encadenamiento y migracin de filas.

.Pctfree

Este parmetro 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. Tambin se puede modificar posteiormente el valor del pctfree alterando la tabla o el ndice.

Este parmetro indica el porcentaje mnimo 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 tambin 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 crearn en otros bloques ya que en este ya no queda sitio para ms. Entonces, qu ocurre con este 20%?. Pues muy sencillo, se utiliza para las modificaciones de las filas que ya estn en el bloque. Cuando se modifica una fila y se aumenta el contenido de un campo, por ejemplo, el campo "nombre" tena 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 operacin.

Por lo tanto, este espacio podra incluso llenarse lo cual, en caso de seguir haciendo modificaciones de este estilo, podra generarnos filas migradas, como se explica ms adelante. Sin embargo, el espacio libre en un bloque tambin 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 inserccin 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 parmetro 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 tendrn 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 estn en l o bien modificando campos de esas filas disminuyendo el tamao de los valores que en ellas estn guardados.
  • Cuanto espacio libre tiene que haber para poder volver a insertar nuevas filas?. Este valor nos lo indica el parmetro 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 (despus 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 lmite mnimo 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 parmetro pctused debido a la finalidad de los mismos y a su estructura interna en forma de rbol binario.

Para consultar el valor tanto del parmetro pctfree como del parmetro 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 parmetros 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 Migracin de Filas

Existen dos circunstancias diferentes por las cuales puede ocurrir que los datos de una fila recin 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 estn contiguos.

Encadenamiento de filas:

El encadenamiento o chained rows, se da cuando los datos de una fila ocupan tanto espacio que no caben fsicamente en un solo bloque y Oracle debe guardarlos en dos o ms 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.

Migracin de filas

Este otro caso se da cuando modificamos los datos de una fila de un bloque, aumentndolos de tamao, es decir, como en le ejemplo anterior, si tenamos 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 informacin mnima de la fila, que ser simplemente un puntero hacia la direccin del nuevo bloque en el que se ha reubicado toda esta fila.

.Temas Relacionados

Relacionado directamente con este tema, se pueden estudiar tambin los siguientes temas:

  • Qu tamao de data block se debe elegir?.
  • Qu es y cmo influye el parmetro 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 contencin de las freelists?.
  • Cmo detectar las filas encadenadas o migradas?.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.