Programación en castellano
Inicio > Tutoriales > Oracle > Estructuras de Oracle
-Tutoriales

Estructuras de Oracle


Data Blocks - Bloques

. Introducción

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?.
 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados