Estructuras de Oracle

Una extensin es una unidad lgica de almacenamiento que est formada por un nmero determinado de bloques de datos contiguos. La agrupacin 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 estn 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 nmero 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 extensin en dicho segmento (en el caso de los rollback se crean dos). El tamao de esta extensin inicial viene dado por el valor parmetro "initial" que se indica en el momento de crear el segmento.

.Asignacin de Extensiones

Al crear o, mejor dicho, asignar una nueva extensin al segmento, se est reservando espacio en el disco para almacenar los nuevos datos de dicho segmento. Por lo tanto, al crear la nueva extensin est totalmente vaca y todo su espacio est disponible para almacenar los datos del segmento y, adems, en el disco debe haber espacio libre para que Oracle reserve todo el tamao que necesita la extensin, y lo formatea de forma especial para poder utilizarlo. A partir de ese momento, en esa extensin solamente se podrn almacenar datos del segmento al que pertenece.

Cuando se llenan todos los bloques de datos de una extensin, el segmento solicita una nueva extensin al sistema para poder seguir almacenando informacin.

Cmo podemos determinar el nmero de extensiones y su tamao de un segmento?.

Para establecer el tamao de las futuras extensiones que ir solicitando un segmento se utilizan varios parmetros a los que hay que dar valor en el momento de la creacin de la tabla, ndice o segmento de rollback. Estos parmetros se indican en la clasula STORAGE de la sentencia que crea el segmento y son los siguientes:

Initial:

Indica el tamao en bytes de la primera extensin que tendr el segmento. Se puede indicar despus del valor una "K" o "M" para que el valor sea interpretado como Kilobytes o Megabytes en lugar de bytes. Si no se pone explcitamente este parmetro en la creacin del segmento, se hereda por defecto el valor que tenga este parmetro 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 extensin oracle redondea el tamao indicado al siguiente mltiplo 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 mltiplo 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; 

Tambin 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 tamao en concreto.

Select segment_name, extent_id, blocks, bytes from dba_extents; 

A pesar de lo que aparece en la documentacin de Oracle sobre los redondeos a mltiplos de 5 bloques, nos hemos encontrado con muchos casos en los que creamos segmentos con una sola extensin 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 debera redondearse realmente dicho valor a un mltiplo de 5, algunas extensiones aparecen con 256 Kbytes y otras con los 280 Kbytes que tericamente deberan tener.

Next:

Indica el tamao que tendr la prxima extensin que se cree cuando no quede ms sitio en las extensiones que ya tiene asignadas el segmento. De igual manera que en el caso del parmetro initial, Oracle redondea a un mltiplo de 5 bloques este valor, a la hora de crear la extensin nueva. Cada vez que se crea una nueva extensin, se recalcula el valor de este parmetro en funcin del valor de pctincrease y se actualiza la vista dba_segments.

Pctincrease:

En el momento que se asigna una nueva extensin al segmento, se recalcula el valor que va a tener la prxima que se le asigne y que ser, el tamao de la extensin recin creada (el next que tena el segmento) aumentado en el porcentaje indicado por pctincrease. Por lo tanto, si qeremos que todas las extensiones de nuestro segmento tengan el mismo tamao, habr que asignarles el pctincrease a 0. Oracle recomienda establecer por norma el pctincrease a 0 para evitar que se descontrolen los tamaos 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 extensin, sta se crear del tamao indicado en next_extent redondendola al primer mltiplo de 5 bloques superior o igual a dicho valor. En nuestro caso 262144 son 32 bloques as que crear una extensin de 35 que son 286720 bytes. Adems, 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 reclculo del siguiente extent (393216) se basa en el valor del anterior next_extent (262144) y no en el valor de la extensin creada al redondear a un mltiplo de 5 bloques (286720), ya que si no, nos habra 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 extensin, se crear realmente una extensin de 50 bloques que son los 430080 bytes.

Minextents:

Se indica el nmero de extensiones que se deben reservar a la vez para un determinado segmento en el momento de su creacin. Por defecto es una excepto en los segmentos de rollback que son dos. Puede que las extensiones no estn contiguas. Por supuesto, si en la clusula storage en la cracin del objeto se indican valores para next y pctincrease, las extensiones iniciales que se crean se recalculan para cumplir lo indicado en estos parmetros.

Por ejemplo, creamos un segmento con minextents = 4, con un initial de 262144, next de tambin 262144, bytes y con un pctincrease del 50%, el resultado ser la creacin de 4 extensiones de tamaos, 286720, 286720, 409600, 614400 y de un next extent de 884736. Estos tamaos vienen de redondear 32, 48 y 72 a mltiplos de 5 y el next extent es 108 bloques que es el 50% de 72 bloques.

Maxextents:

Es el numero mximo de extensiones que se pueden crear en ese objeto, contando tambin 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 podran aumentar excesivamente de tamao y llenaran el disco. As que hay que tener cuidado a la hora de crear rollback segments, sobretodo porque heredan por defecto el valor del parmetro que tenga asignado el tablespace en el que se crean.

Vamos a poner un ejemplo de creacin de una tabla en la que se indican valores para los parmetros de la clusula 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 mximo 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 extensin a un segmento realiza el siguiente proceso para buscar bloques de datos contiguos en igual nmero o superior al solicitado por la extensin:

  • En primer lugar, busca un conjunto de bloques contiguos igual al solicitado por la extensin ms uno, para evitar la fragmentacin (excepto cuando la extensin es de 5 o menos bloques). Por lo tanto, si la extensin nueva es de 29 bloques oracle buscar un conjunto de justo 30 bloques libres consecutivos.
  • Si no encuentra ningn conjunto de exactamente ese nmero de bloques, empieza a buscar un conjunto de ms bloques contiguos. Si el primer conjunto que encuentra tiene ms 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 ms bloques, cogera solo los 30 primeros, mientras que si encuentra un conjunto de entre 31 y 34 se lo quedara 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 extensin algo ms grande que otras del mismo segmento.

Cuando no encuentra ningn conjunto de bloques de tamao superior al que busca, realiza un coalesce del tablespace, que es un proceso mediante el cual se unen los distintos bloques que han ido quedndose 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 ningn conjunto de bloques para crear la nueva extensin, intenta aumentar el tamao de alguno de los datafiles del tablespace. Esto solamente lo conseguir si tienen activado el autoexpand. En caso de no conseguirlo, devolver un error.

.Desasignacin 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 instruccin 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, estarn vacas.

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 instruccin ya que se eliminan todos los datos de la tabla y, no hay rollback posible. En los segmentos de rollback, si tienen puesto el parmetro optimal, oracle peridicamente puede desasignarle las extensiones que no usa hasta que vuelve a tener el tamao ptimo. Finalmente, existe una sentencia que tambin desasigna las extensiones que no se usan en una tabla:

Alter table nombre_de_table deallocate unused; 

En cuanto se ha desasignado una extensin del segmento al que perteneca, 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 extensin, 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 asignrsela al segmento. A esta operacin se le llama COALESCE de extensiones.

.Temas Relacionados

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

  • Qu es la fragmentacin de los tablespaces?.
  • Cuntas extensiones debe tener un segmento y por qu?.
  • Cmo disminuir las extensiones de un segmento?.

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.