lunes, 19 de abril de 2010

¿QUE ES UN SEGEMENTO?

Introducción

Un segmento almacena la información de una estructura lógica de Oracle dentro de un Tablespace. Está formado por una o más extensiones y, a medida que va creciendo el segmento se van asignando nuevas extensiones al mismo. Hay cuatro tipos de segmentos: de datos, de índices, temporales y de rollback.

Segmentos de datos e índices

En un segmento de datos se almacenan todos los datos de una tabla que no esté particionada o que no forme parte de un cluster, de una partición de una tabla particionada o, de un cluster de tablas. Se crea el segmento de datos a la hora de ejecutar la sentencia create que crea la tabla, cluster o partición. En dicha sentencia se indican también los valores de la cláusula storage, que se han explicado en el capítulo que hace referencia a las extensiones, y va a determinar la forma en que dicho segmento va a ir asignando y desasignando las extensiones.

En el caso de los índices, existe un segmento para cada índice no particionado o para cada partición de un índice particionado. Al igual que con las tablas, los segmentos de índices se crean al ejecutar la sentencia de creación de índices en la cual, también se pueden indicar valores para la cláusula storage y así parametrizar la forma en que se le asignarán las extensiones a medida que vaya creciendo.
Segmentos temporales

Cuando Oracle procesa las consultas se puede ver en la necesidad de utilizar espacio en disco para poder llevar a cabo algunas partes del parsing (análisis) y de la ejecución de la misma. Solamente utilizará este tipo de segmentos cuando no pueda realizar la consulta íntegramente en memoria o cuando no pueda buscarse un método alternativo para realizarla utilizando los índices.

Hay varios tipos de sentencias en las que Oracle se ve en la obligación de utilizar los segmentos temporales:

SELECT ... ORDER BY.
CREATE INDEX.
SELECT ... GROUP BY.
SELECT ... UNION ...
SELECT DISTINCT ...
SELECT INSERSEC ...
SELECT MINUS ...

Se puede dar el caso en el que algunas consultas en las que intervengan joins en los que no haya índices que faciliten la unión y en las que se den a la vez sentencias del tipo "group by" y "order by" o incluso "distinct", en las que no solo se requiere de un nuevo segmento temporal sino que pueden adquirirse dos segmentos para poder realizar dichas consultas.

Como es natural, cuantas más operaciones se hagan en memoria mejor será el rendimiento del sistema, por lo que si en nuestra aplicación existe un número considerable de consultas de las mencionadas anteriormente, resulta muy apropiado hacer un tunning para decidir si ampliar la zona de memoria reservada para las ordenaciones, aumentando el valor del parámetro SORT_AREA_SIZE.

En Oracle también existen las tablas temporales y los índices temporales para dichas tablas. Estos objetos tambíen utilizan segmentos temporales, pero se les asigna y desasigna de forma diferente a como se hace con las consultas, creación de índices y ordenaciones.

Asignación de segmentos temporales en consultas.

En las consultas, los segmentos temporales se van asignando según se van necesitando y, al terminar la ejecución de la sentencia, se desasignan. Para determinar en qué tablespace se van a crear los segmentos temporales necesarios para estas consultas, a cada usuario de la base de datos, se le asigna un tablespace para dicha función. Esto se realiza con el siguiente comando:

Alter user nombre_de_usuario default tablespace nombre_tablespace_temporal;

Por defecto, en la creación del usuario también se le puede asignar un tablespace temporal y, si no se le indica, el sistema le asigna por defecto siempre el tablespace SYSTEM. Es muy importante que ningún esquema o usuario tenga como tablespace temporal el SYSTEM por varios motivos. En primer lugar, porque SYTEM no es un tablespace temporal y por lo tanto, no está optimizado para la gestión de los segmentos temporales, en segundo lugar, al utilizar SYSTEM como tablespace temporal, se aumenta la fragmentación de dicho tablespace por culpa de los segmentos temporales que se van creando y borrando en medio de segmentos de datos e índices con lo que disminuye drásticamente el rendimiento del tablespace principal de la base de datos, y por último, se corre el peligro de que se llene este tablespace por culpa de alguna select mal escrita y que se descontrole aumentando desproporcinadamente el tamaño del segmento temporal creado para ejecutarla.

Asignación de segmentos temporales para tablas temporales

El segmento requerido para una tabla temporal y para sus índices temporales se asigna en el momento de producirse la primera insert en dicha tabla. Este segmento al igual que en el caso anterior, se creará en el tablespace temporal del usuario que está creando la tabla temporal. Para conocer el tablespace por defecto de un usuario y su tablespace temporal, podemos consultar la vista dba_users.

Select username, default_tablespace, temporary_tablespace from dba_users;

La explicación del funcionamiento de las tablas temporales excede los objetivos de este manual por lo que no se va a profundizar más en ellas, simplemente se indicará aquí que la eliminación del segmento temporal que se ha creado se hará dependiendo del tipo de tabla temporal que se ha creado. Cuando la tabla temporal es específica para una transacción, Oracle eliminará el segmento creado al finalizar dicha transacción, y si por el contrario, la tabla es específica para la sesión, su segmento se eliminará al terminarse esta sesión.

No hay comentarios:

Publicar un comentario