Tablespaces y archivos de datos
Descripción general y directivas
1. Descripción general
Un tablespace es una unidad lógica de almacenamiento, y está compuesto por uno o varios archivos físicos (archivos de datos).
La mayoría de las operaciones de administración relativas al almacenamiento se realiza a nivel del tablespace y no a nivel de los archivos de datos.
Dentro de un tablespace, el almacenamiento se organiza en segmentos, compuestos por una o varias extensiones (extent). Estas extensiones se pueden administrar "por el diccionario" o "localmente". En el primer caso (tablespace administrado por el diccionario) la información de las extensiones libres y asignadas se almacena en tablas del diccionario de datos; en el segundo caso (tablespace administrado localmente) la información de las extensiones libres y asignadas se almacena en el encabezado de los archivos de datos del tablespace.
En la versión 10, Oracle ha introducido la noción de tablespace BIGFILE: un tablespace BIGFILE es un tablespace compuesto por un único archivo de datos que puede ser particularmente voluminoso (hasta 2ˆ32 bloques Oracle, es decir más de 4 billones de bloques). Por el contrario, un tablespace tradicional, normalmente llamado tablespace SMALLFILE, puede contener varios archivos de datos (hasta 1 022 archivos) pero de tamaño más limitado ("solo" 2ˆ22 bloques Oracle, es decir, más de 4 millones de bloques).
Cuando un tablespace SMALLFILE contiene varios...
Tablespace permanente
1. Creación de un tablespace permanente
La sentencia SQL CREATE TABLESPACE permite crear un tablespace permanente.
Sintaxis simplificada
CREATE [ BIGFILE | SMALLFILE ] TABLESPACE nombre
DATAFILE especificación_archivo [,...]
[ cláusula_gestión_extensión ]
[ cláusula_gestión_segmento ]
[ MINIMUM EXTENT valor [K|M] ]
[ DEFAULT [ cláusula_compresión ] [ cláusula_almacenamiento ] ]
[ BLOCKSIZE valor [K] ]
[ LOGGING | NOLOGGING ]
[ FORCE LOGGING ]
[ FLASHBACK { ON | OFF } ]
[ ONLINE | OFFLINE ];
- especificación_archivo
'nombre_archivo' [ SIZE valor [K|M|G|T] ] [REUSE]
[ cláusula_auto_extensión ]
- cláusula_auto_extensión
AUTOEXTEND OFF
| AUTOEXTEND ON [ NEXT valor [K|M|G|T] ]
[ MAXSIZE UNLIMITED | valor [K|M|G|T] ]
- cláusula_gestión_extent
EXTENT MANAGEMENT DICTIONARY
| EXTENT MANAGEMENT LOCAL
{ AUTOALLOCATE | UNIFORM [ SIZE valor [K|M|G|T] ] }
- cláusula_gestión_segmento
SEGMENT SPACE MANAGEMENT { MANUAL | AUTO }
- cláusula_almacenamiento
STORAGE ( [ INITIAL valor [K|M] ]
[ NEXT valor [K|M] ]
[ MINEXTENTS valor ]
[ MAXEXTENTS { valor | UNLIMITED } ]
[ PCTINCREASE valor ] )
- cláusula_compresión
COMPRESS [ { BASIC | FOR OLTP } ]
| NOCOMPRESS
Ejemplo:
Tablespace para las tablas, con una gestión local uniforme de las extensiones:
CREATE TABLESPACE data
DATAFILE 'e:\oradata\NuestraBase\data01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 800M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 10M
SEGMENT SPACE MANAGEMENT AUTO;
Tablespace para los índices...
Organización del almacenamiento dentro de un tablespace
1. Principios generales
La organización del almacenamiento dentro de un tablespace se puede resumir mediante el siguiente esquema.
Dentro de un tablespace, el almacenamiento se organiza en segmentos que contienen una o varias extensiones (extents), siendo una extensión un conjunto de bloques Oracle contiguos.
Cuando se crea un segmento en un tablespace, Oracle le asigna una o varias extensiones en alguno de los archivos de datos del tablespace. Cuando el espacio inicialmente asignado está lleno (después de la inserción de datos, por ejemplo), Oracle asigna una nueva extensión al segmento, y así sucesivamente. Todas las extensiones asignadas a un segmento están en el tablespace de creación del segmento, pero no obligatoriamente juntas, ni forzosamente en el mismo archivo de datos (si el tablespace está compuesto por varios archivos de datos). Cuando se elimina un segmento, las extensiones que ocupa se liberan y quedan disponibles para otros segmentos. La creación/eliminación frecuente de segmentos en un tablespace pueden conducir a una fragmentación del espacio disponible en este tablespace.
Para recordar, existen cuatro tipos principales de segmentos:
-
los segmentos de tabla: espacio ocupado por las tablas;
-
los segmentos de índice: espacio ocupado por los índices;
-
los segmentos de anulación: espacio temporal utilizado para almacenar la información que permite anular una transacción;
-
los segmentos temporales: espacio temporal utilizado fundamentalmente durante una operación de ordenación.
La primera extensión de un segmento contiene, al menos, dos bloques. El primero se reserva al encabezado del segmento (no contiene datos útiles, sino la libreta de extensiones asignadas al segmento). Sucede lo mismo para cada archivo de datos del tablespace; el primer bloque es un bloque de encabezado (veremos que el encabezado del archivo puede contener más bloques).
Veremos en el capítulo Gestión de las tablas e índices cómo, bajo ciertas condiciones, es posible liberar extensiones sin eliminar el segmento.
Un tablespace se puede "gestionar por el diccionario" o "gestionar localmente".
En un tablespace "gestionado por el diccionario" la información relativa a la gestión del espacio...
Tablespace temporal
1. Rol del tablespace temporal
Cuando una consulta necesita una operación de ordenación (cláusula ORDER BY, por ejemplo), Oracle intenta hacer la ordenación en memoria, en la PGA del proceso de servidor que ejecuta la consulta.
Si la ordenación no se puede realizar en memoria, Oracle desacopla el conjunto de información en fracciones y ordena cada fracción individualmente, almacenando los resultados intermedios en disco en los segmentos temporales.
Un segmento temporal se puede crear en cualquier tablespace, pero no es deseable a efectos de rendimiento.
Por tanto, Oracle recomienda crear un tablespace dedicado, de tipo TEMPORARY, para almacenar los segmentos temporales y, preferiblemente, un tablespace temporal administrado localmente. Es posible crear un tablespace temporal administrado por el diccionario, pero se limita el rendimiento, por lo que Oracle abandona esta opción; por este motivo no se ha comentado inicialmente.
Las consultas que pueden solicitar una operación de ordenación son las siguientes:
-
SELECT ... ORDER BY;
-
SELECT ... GROUP BY;
-
SELECT DISTINCT ...;
-
consultas de unión (UNION, INTERSECT, MINUS);
-
CREATE INDEX;
-
cálculo de estadísticas;
-
joins por ordenación-mezcla (sort merge join).
Es posible utilizar un tablespace permanente como tablespace temporal (esto es lo que pasa por defecto con el tablespace SYSTEM), pero no es aconsejable, fundamentalmente desde el punto de vista del rendimiento. De hecho, en un tablespace permanente, los segmentos temporales se asignan y se liberan con cada ordenación; penaliza el rendimiento y se corre el riesgo de fragmentar el espacio disponible del tablespace. En caso de usar un tablespace temporal, se crea un único segmento de ordenación para la primera ordenación y se reutiliza para las siguientes ordenaciones.
El segmento temporal se puede compartir entre varias ordenaciones (pero no las extensiones) y solo se libera durante la parada de la instancia; de esta manera, se produce una menor asignación dinámica de extensiones y el rendimiento se optimiza.
Un tablespace permanente administrado localmente no se puede utilizar como tablespace temporal; este no es el caso de un tablespace permanente, administrado por el diccionario.
Los tablespaces temporales también se utilizan para el almacenamiento de las tablas temporales, creadas por la sentencia...
Conclusiones
1. Ventajas de los tablespaces administrados localmente
Los tablespaces administrados localmente presentan numerosas ventajas:
-
menos SQL recursivo, incluso de gestión recursiva del espacio, relacionado con la actualización del diccionario de datos;
-
extensiones adyacentes libres, identificadas automáticamente, lo que elimina las operaciones de fusión (coalesce) de las extensiones adyacentes libres;
-
limitación, incluso desaparición de los problemas de fragmentación del espacio disponible.
Con un tablespace administrado por el diccionario, cuando la instancia asigna o libera una extensión, ésta debe leer y después actualizar el diccionario de datos usando sentencias SQL SELECT, INSERT, UPDATE o DELETE; estas diferentes sentencias se llaman "SQL recursivo" y son susceptibles de utilizar espacio de anulación en el segmento de anulación SYSTEM. Durante la actualización del diccionario, Oracle puede sufrir falta de espacio en la tabla del diccionario o en el segmento de anulación: el resultado es una asignación recursiva de espacio, lo que penaliza el rendimiento. Estos problemas desaparecen, en gran medida, con los tablespaces administrados localmente.
En un tablespace administrado por el diccionario, cuando una extensión se libera, Oracle no comprueba inmediatamente si es adyacente a una extensión ya libre. Más tarde...
Encontrar información de los tablespaces y archivos de datos
1. Tablespaces y archivos de datos
Varias vistas del diccionario de datos permiten obtener información de los tablespaces y archivos de datos:
-
DBA_TABLESPACES o V$TABLESPACE: información de los tablespaces;
-
DBA_DATA_FILES o V$DATAFILE: información de los archivos de datos (salvo los de los tablespaces temporales administrados localmente);
-
DBA_TEMP_FILES o V$TEMPFILE: información de los archivos de datos de los tablespaces temporales administrados localmente;
-
DBA_TABLESPACE_GROUPS: información de los grupos de tablespaces temporales;
-
DATABASE_PROPERTIES: propiedades de la base de datos: el tablespace temporal predeterminado, el tablespace permanente predeterminado y el tipo de tablespace por defecto (BIGFILE o SMALLFILE).
Las columnas interesantes de las diferentes vistas se presentan a continuación.
DBA_TABLESPACES
TABLESPACE_NAME |
Nombre del tablespace. |
CONTENTS |
Tipo de tablespace (PERMANENT o TEMPORARY o UNDO). |
EXTENT_MANAGEMENT |
DICTIONARY: el tablespace se administra por el diccionario. LOCAL: el tablespace se administra localmente. |
ALLOCATION_TYPE |
USER: gestión de extensiones por "el usuario" (tablespace administrado por el diccionario). SYSTEM: gestión automática de extensiones (tablespace administrado localmente). UNIFORM: gestión uniforme de extensiones (tablespace administrado localmente). |
STATUS |
Estado del tablespace (ONLINE, OFFLINE o READ ONLY). |
BLOCK_SIZE |
Tamaño de bloque del tablespace. |
LOGGING |
Modo de traza por defecto (LOGGING o NOLOGGING). |
FORCE_LOGGING |
Indica si el tablespace está en FORCE LOGGING (YES o NO). |
SEGMENT_SPACE_MANAGEMENT |
Indica si el espacio libre en los segmentos se administra manual (MANUAL) o automáticamente (AUTO). |
BIGFILE |
Indica si el tablespace es un tablespace BIGFILE (YES o NO). |
Ejemplo:
SQL> SELECT tablespace_name,contents,extent_management,
2 asignation_type,bigfile,block_size,status
3 FROM dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN ALLOCATIO BIG BLOCK_SIZE STATUS
--------------- --------- ---------- --------- --- ---------- ------
SYSTEM PERMANENT LOCAL SYSTEM NO 8192 ONLINE
SYSAUX PERMANENT LOCAL ...
Utilizar EM Express
En EM Express, seleccione el elemento Tablespaces del menú Almacenamiento para acceder a la página de gestión de los tablespaces y archivos de datos:
Desde esta página puede realizar diversas acciones:
-
sobre los tablespaces:
-
crear un tablespace (menú o botón Crear);
-
eliminar un tablespace (menú o botón Borrar);
-
añadir un archivo de datos al tablespace (menú o botón Agregar Archivo de Datos);
-
modificar el estado (ONLINE / OFFLINE, READ ONLY / READ WRITE) del tablespace (menú Definir Estado);
-
definir el tablespace como tablespace por defecto (menú Definir como Valor por Defecto).
-
sobre los archivos de datos:
-
eliminar un archivo de datos (menú o botón Borrar);
-
modificar el estado (ONLINE / OFFLINE) de un archivo de datos (menú Definir Estado);
-
modificar la extensión automática de un archivo de datos (menú Editar Ampliación Automática);
-
modificar el tamaño de un archivo de datos (menú Cambiar Tamaño).
-
sobre los grupos de tablespaces temporales:
-
añadir un tablespace temporal a un grupo (menú Grupos de tablespaces - Definir Grupo);
-
eliminar un tablespace temporal de un grupo (menú Grupos de Tablespaces - Eliminar del Grupo).
La creación permanente de un tablespace se realiza en cinco etapas:
1. |
definición de las características generales... |
Problemas habituales y soluciones
Esto no es más que el principio. Veremos otros posibles problemas, relativos al almacenamiento en un tablespace, en el capítulo Gestión de las tablas e índices (almacenamiento de las tablas e índices).
ORA-01652: imposible ampliar el segmento temporal de N en el tablespace X
Explicación
El segmento temporal no llega a extenderse (durante una operación de ordenación, por ejemplo).
Causa(s)
El segmento temporal no llega a extenderse porque el tablespace en el que se almacena no tiene suficiente espacio disponible y no se puede ampliar.
Acción(es)
Hay que aumentar el espacio disponible en el tablespace:
-
asignándole un nuevo archivo de datos (ALTER TABLESPACE... ADD TEMPFILE ...);
-
aumentando el tamaño de algún archivo de datos del tablespace (ALTER DATABASE TEMPFILE ... RESIZE ...);
-
autorizando a un archivo de datos del tablespace a ampliarse automáticamente (ALTER DATABASE TEMPFILE ... AUTOEXTEND ON ...).
Si es necesario se puede emplear la vista V$TEMPSEG_USAGE para supervisar, en tiempo real, las operaciones que utilizan el espacio temporal.
Este problema se puede producir en cualquier consulta que solicite una ordenación.
ORA-01630: número máximo de conjuntos de bloques contiguo (N) esperado en segmento temp, tablespace X
Explicación
El segmento temporal no llega a ampliarse (durante una operación de ordenación...