Estructuras de Oracle

Una extensi�n es una unidad l�gica de almacenamiento que est� formada por un n�mero determinado de bloques de datos contiguos. La agrupaci�n de una o varias extensiones forman un segmento que puede ser una tabla, un �ndice, un segmento de rollback o un segmento temporal. Por lo tanto, datos de una tabla, sabemos que est�n en un solo segmento de tipo tabla, que a su vez estar� formado por una o varias extensiones y que, cada una de esas extensiones est� formada por un n�mero determinado de bloques de datos.

Cuando se crea un segmento nuevo, es decir, una tabla, un �ndice o un segmento de rollback, se crea obligatoriamente una extensi�n en dicho segmento (en el caso de los rollback se crean dos). El tama�o de esta extensi�n inicial viene dado por el valor par�metro "initial" que se indica en el momento de crear el segmento.

.�Asignaci�n de Extensiones

Al crear o, mejor dicho, asignar una nueva extensi�n al segmento, se est� reservando espacio en el disco para almacenar los nuevos datos de dicho segmento. Por lo tanto, al crear la nueva extensi�n est� totalmente vac�a y todo su espacio est� disponible para almacenar los datos del segmento y, adem�s, en el disco debe haber espacio libre para que Oracle reserve todo el tama�o que necesita la extensi�n, y lo formatea de forma especial para poder utilizarlo. A partir de ese momento, en esa extensi�n solamente se podr�n almacenar datos del segmento al que pertenece.

Cuando se llenan todos los bloques de datos de una extensi�n, el segmento solicita una nueva extensi�n al sistema para poder seguir almacenando informaci�n.

�C�mo podemos determinar el n�mero de extensiones y su tama�o de un segmento?.

Para establecer el tama�o de las futuras extensiones que ir� solicitando un segmento se utilizan varios par�metros a los que hay que dar valor en el momento de la creaci�n de la tabla, �ndice o segmento de rollback. Estos par�metros se indican en la cla�sula STORAGE de la sentencia que crea el segmento y son los siguientes:

Initial:

Indica el tama�o en bytes de la primera extensi�n que tendr� el segmento. Se puede indicar despu�s del valor una "K" o "M" para que el valor sea interpretado como Kilobytes o Megabytes en lugar de bytes. Si no se pone expl�citamente este par�metro en la creaci�n del segmento, se hereda por defecto el valor que tenga este par�metro en el tablespace en el que se est� creando el segmento y que, si no se ha indicado tampoco, por defecto son 5 bytes. Cuando se crea una extensi�n oracle redondea el tama�o indicado al siguiente m�ltiplo superior a 5 bloques de datos. Por lo tanto, si nuestros bloques son de 8192 bytes y creamos un segmento con un inital de 256Kbytes, realmente estamos creando un segmento de 32 bloques y oracle lo redondea a 35 bloques que es el primer m�ltiplo superior a 5 de 32. Por lo tanto, nuestra initial extent ser� de 35 * 8192 = 280 Kbytes.

Para comprobar estos datos se puede consultar la tabla dba_segments en la que tenemos un registro por cada segmento distinto:

Select segment_name, initial_extent, next_extent, pct_increase, min_extent, 
max_extent from dba_segments; 

Tambi�n se puede consultar la vista dba_extents que es un detalle de dba_segments ya que aqu� se detalla por cada segmento todas sus extensiones, con su tama�o en concreto.

Select segment_name, extent_id, blocks, bytes from dba_extents; 

A pesar de lo que aparece en la documentaci�n de Oracle sobre los redondeos a m�ltiplos de 5 bloques, nos hemos encontrado con muchos casos en los que creamos segmentos con una sola extensi�n de 256 Kbytes con bloques de 8192 bytes (con el caso anterior), y en la vista dba_extents, al consultar el valor de initial_extent sigue siendo 256 Kbytes, y en dba_extents, que es donde deber�a redondearse realmente dicho valor a un m�ltiplo de 5, algunas extensiones aparecen con 256 Kbytes y otras con los 280 Kbytes que te�ricamente deber�an tener.

Next:

Indica el tama�o que tendr� la pr�xima extensi�n que se cree cuando no quede m�s sitio en las extensiones que ya tiene asignadas el segmento. De igual manera que en el caso del par�metro initial, Oracle redondea a un m�ltiplo de 5 bloques este valor, a la hora de crear la extensi�n nueva. Cada vez que se crea una nueva extensi�n, se recalcula el valor de este par�metro en funci�n del valor de pctincrease y se actualiza la vista dba_segments.

Pctincrease:

En el momento que se asigna una nueva extensi�n al segmento, se recalcula el valor que va a tener la pr�xima que se le asigne y que ser�, el tama�o de la extensi�n reci�n creada (el next que ten�a el segmento) aumentado en el porcentaje indicado por pctincrease. Por lo tanto, si qeremos que todas las extensiones de nuestro segmento tengan el mismo tama�o, habr� que asignarles el pctincrease a 0. Oracle recomienda establecer por norma el pctincrease a 0 para evitar que se descontrolen los tama�os de los segmentos, especialmente los temporales, aunque, curiosamente, su valor por defecto es de 50%. No se puede modificar el pctincrease de los segmentos de rollback que es siempre 0.

Mostremos un ejemplo: tenemos un segmento que en el campo next_extent tiene como valor 262144 y en pct_increase tiene 50 y los bloques son de 8192 bytes. Cuando crezca el segmento y solicite una nueva extensi�n, �sta se crear� del tama�o indicado en next_extent redonde�ndola al primer m�ltiplo de 5 bloques superior o igual a dicho valor. En nuestro caso 262144 son 32 bloques as� que crear� una extensi�n de 35 que son 286720 bytes. Adem�s, recalcula el valor del siguiente next_extent aumentando en un 50% el valor del antiguo next_extent, es decir 262144 * 1,5 = 393216 bytes.

Nota: el rec�lculo del siguiente extent (393216) se basa en el valor del anterior next_extent (262144) y no en el valor de la extensi�n creada al redondear a un m�ltiplo de 5 bloques (286720), ya que si no, nos habr�a salido un next_extent de 286720 * 1,5 = 430080. Por lo tanto, al consultar las tabla dba_segments veremos que next_extent es 393216 es decir 48 bloques, aunque, eso si, si se vuelve a llenar esta extensi�n, se crear� realmente una extensi�n de 50 bloques que son los 430080 bytes.

Minextents:

Se indica el n�mero de extensiones que se deben reservar a la vez para un determinado segmento en el momento de su creaci�n. Por defecto es una excepto en los segmentos de rollback que son dos. Puede que las extensiones no est�n contiguas. Por supuesto, si en la cl�usula storage en la cr�aci�n del objeto se indican valores para next y pctincrease, las extensiones iniciales que se crean se recalculan para cumplir lo indicado en estos par�metros.

Por ejemplo, creamos un segmento con minextents = 4, con un initial de 262144, next de tambi�n 262144, bytes y con un pctincrease del 50%, el resultado ser� la creaci�n de 4 extensiones de tama�os, 286720, 286720, 409600, 614400 y de un next extent de 884736. Estos tama�os vienen de redondear 32, 48 y 72 a m�ltiplos de 5 y el next extent es 108 bloques que es el 50% de 72 bloques.

Maxextents:

Es el numero m�ximo de extensiones que se pueden crear en ese objeto, contando tambi�n la primera. Se puede especificar UNLIMITED con lo que pueden crecer indefinidamente. No se recomienda que a los segmentos de rollback se les asigne unlimited maxextents ya que con operaciones complejas podr�an aumentar excesivamente de tama�o y llenar�an el disco. As� que hay que tener cuidado a la hora de crear rollback segments, sobretodo porque heredan por defecto el valor del par�metro que tenga asignado el tablespace en el que se crean.

Vamos a poner un ejemplo de creaci�n de una tabla en la que se indican valores para los par�metros de la cl�usula storage que acabamos de explicar. Crearemos, por ejemplo, una tabla llamada empleado que contiene un solo campo, nombre, con un initial extent de 256 Kilobytes, con 512 Kilobytes de next extent, un pctincrease de 50, con 3 extensiones iniciales y con un m�ximo de 10 extensiones:

create table empleado (nombre varchar2(50)) 
storage (initial 256K  next 512K pctincrease 50 minextents 3  maxextents 10)  

Si consultamos la vista dba_extents nos mostrar� que ha creado las 3 extensiones que le hemos indicado con los siguientes valores:

Select extent_id, bytes, blocks from dba_extents 
where segment_name = 'EMPLEADO' order by extent_id; 

         0     286720         35 
         1     532480         65 
         2     819200        100 

Y, al consultar la vista dba_segments o incluso la vista user_tables para este segmento en concreto, observamos el valor de next_extent:

Select next_extent from user_extents where segment_name = 'EMPLEADO'; 

1179648 que es el resultado de 512K * 1,5 * 1,5. 

Cuando Oracle necesita asignar una nueva extensi�n a un segmento realiza el siguiente proceso para buscar bloques de datos contiguos en igual n�mero o superior al solicitado por la extensi�n:

  • En primer lugar, busca un conjunto de bloques contiguos igual al solicitado por la extensi�n m�s uno, para evitar la fragmentaci�n (excepto cuando la extensi�n es de 5 o menos bloques). Por lo tanto, si la extensi�n nueva es de 29 bloques oracle buscar� un conjunto de justo 30 bloques libres consecutivos.
  • Si no encuentra ning�n conjunto de exactamente ese n�mero de bloques, empieza a buscar un conjunto de m�s bloques contiguos. Si el primer conjunto que encuentra tiene m�s de 5 bloques que los que busca, se queda solamente con los que busca, mientras que si la diferencia es de menos de 5 bloques, se coge todo el conjunto.

Por lo tanto, en nuestro caso, si el primer conjunto que encuentra fuera de 35 o m�s bloques, coger�a solo los 30 primeros, mientras que si encuentra un conjunto de entre 31 y 34 se lo quedar�a entero.

Nota: En este paso se puede comprobar que, aunque a un segmento le asignemos pctincrease 0, puede que luego nos encontremos en dba_extents algun extensi�n algo m�s grande que otras del mismo segmento.

Cuando no encuentra ning�n conjunto de bloques de tama�o superior al que busca, realiza un coalesce del tablespace, que es un proceso mediante el cual se unen los distintos bloques que han ido qued�ndose fragmentados en el tablespace al irse creando y eliminando extensiones mediante este proceso. Una vez hecho el coalesce, Oracle vuelve a repetir los pasos anteriores.

Si, finalmente no encuentra ning�n conjunto de bloques para crear la nueva extensi�n, intenta aumentar el tama�o de alguno de los datafiles del tablespace. Esto solamente lo conseguir� si tienen activado el autoexpand. En caso de no conseguirlo, devolver� un error.

.�Desasignaci�n de Extensiones

Las extensiones que han sido reservadas por un segmento no son devueltas a Oracle para que se las pueda signar a otro segmento del mismo tablespace hasta que se elimina el objeto mediante la instrucci�n DROP. Por lo tanto, cuando tenemos una tabla que nos ocupa varias extensiones, a pesar de que borremos todas sus filas, esa tabla seguir� teniendo reservadas las extensiones aunque eso si, estar�n vac�as.

Existen algunas excepciones. Se pueden devolver todas las extensiones de una tabla excepto las min_extents haciendo un truncate de la misma. Hay que ser muy cuidadoso con esta instrucci�n ya que se eliminan todos los datos de la tabla y, no hay rollback posible. En los segmentos de rollback, si tienen puesto el par�metro optimal, oracle peri�dicamente puede desasignarle las extensiones que no usa hasta que vuelve a tener el tama�o �ptimo. Finalmente, existe una sentencia que tambi�n desasigna las extensiones que no se usan en una tabla:

Alter table nombre_de_table deallocate unused; 

En cuanto se ha desasignado una extensi�n del segmento al que pertenec�a, Oracle ya la puede volver a reclamar para que la puedan utilizar otros segmentos del mismo tablespace. Por lo tanto, cuando un nuevo objeto solicite una nueva extensi�n, si Oracle no encuentra espacio libre suficiente para crear una nueva, y entre las que ha ido desasignando tampoco encuentra ninguna suficientemente grande como para asignarla, puede unir varias de estas extensiones hasta conseguir una lo suficientemente grande como para poder asign�rsela al segmento. A esta operaci�n se le llama COALESCE de extensiones.

.�Temas Relacionados

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

  • �Qu� es la fragmentaci�n de los tablespaces?.
  • �Cu�ntas extensiones debe tener un segmento y por qu�?.
  • �C�mo disminuir las extensiones de un segmento?.

COMPARTE ESTE ARTÍCULO

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