La gestión del espacio de un tablespace ocurre a varios niveles:
- Redimensionando o añadiendo nuevos datafiles.
- Añadiendo extensiones a segmentos.
Gestión de extent
El método de dirección de extent está indicado al crear el tablespace y se aplica a todos los segmentos del tablespace.
Hay dos técnicas para la dirección de extent:
- Gestión de Diccionario de Datos: Nunca debe usarse por su bajo rendimiento. La base de datos registra dentro del diccionario los extents libres y ocupados. Cada vez que se produce un movimiento en los extents se tiene que actualizar las tablas correspondientes. Consulta constantemente las tablas SYS.FET$ y SYS.UET$ (la primera guarda los segmentos libres y la segunda los usados) localizadas en el diccionario. Esto provoca contención en el tablespace de System.
- Locally manager: Oracle recomienda la utilización de esta opción. El registro de extents se hace a través de bitmaps. Cada bit dentro del bitmap corresponde a un bloque o grupo de bloques, cuando a un extents se le asigna espacio, el servidor de Oracle cambia los valores del bitmap para mostrar el nuevo status de los bloques.
Con esta opción existen dos formas para asignar el espacio de los extents:
- UNIFORM: Asigna y desasigna el espacio en los extents de un tamaño uniforme. Este es el valor por defecto en los tablespaces temporales y no se puede especificar en los tablespaces de undo.
- AUTOLLOCATE: Varia el tamaño de los extents para cada segmento. Por ejemplo, en Windows y en Linux con bloques de datos de 8KB, los primero 16 extents de un segmento serán de 64 KB. Los siguientes 63 extents serán de 1MB, de 8MB los siguientes 64 extent, y así progresivamente. Este algoritmo permite que los segmentos pequeños sean pequeños, mientras los grandes irán creciendo sin afectar a los demás segmentos.
EJEMPLOS GESTIóN DE EXTENT
Uso de la cláusula UNIFORM para crear un tablespace donde los extent siempre tengan el mismo tamaño:
- CREATE TABLESPACE large_tabs
- DATAFILE ‘large_tabs_01.dbf’
- EXTENT MANAGEMENT LOCAL UNIFORM SIZE 160M;
Cada extent asignado en este tablespace será de 160MB, por lo que habrá unos 64 extent. El mapa de bit será de 64 bits, un bits por cada 160MB de espacio libre.
Uso de la cláusula AUTOLLACATE para crear un tablespace donde los extent que se van añadiendo van siendo más grande que los anteriores, si no se indica nada esta es la forma por defecto que usa un tablespace:
- CREATE TABLESPACE any_tabs
- DATAFILE ‘any_tabs_01.dbf’
- EXTEN MANAGEMENT LOCAL AUTOALLOCATE;
Cada extent asignado en este tablespace será de 64 KB. Cuando un segmento se llena y requiere más extents, Oracle asignara extents de 64Kb hasta 16 extent, y despues asignará extents cada vez más grandes
Para saber si un tablespace esta manejado por diccionario:
- SELECT tablespace_name, extent_management
Para convertir un tablespace manejado por diccionario ha manejado por local:
- EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRAGTE_TO_LOCAL (‘ nombre tablespace ’);
Gestión de espacios de segmentos
La gestión de espacio de segmento está indicado al crear el tablespace y se aplica a todos los segmentos del tablespace. Existen dos métodos de gestionar los espacios en los segmentos.
Manual:
- Cada nuevo segmento creado en el tablespace tiene un conjunto de mapas de bits que describen la ocupación de sus bloques.
- Oracle recomienda utilizar siempre este método.
Automática:
- Usa una lista simple que informa de los bloques disponibles pero no de la ocupación.
- Este método provoca un exceso de actividad y espacio desaprovechado.
- Oracle desaconsejada este método.
El método elegido se aplica a un tablespace y este afecta todos sus segmentos. La cláusula SEGMENT SPACE MANAGEMENT MANUAL se utiliza al crear un tabla con el comando CREATE TABLESPACE. Para conocer el tipo de gestión de cada tablespace se puede usar la vista de Diccionario de Datos DBA_TABLESPACES.