Recuperando espacio lógico de un tablespace

11

Tengo un espacio de tabla llamado DATOS, y está configurado con autoextensión como falso. Este espacio de tabla tiene dos archivos de datos y está configurado para que ocupe 350 GB de espacio físico.

Hace una semana consulté user_tablespaces y dba_data_files y noté que tenía un 20% de espacio lógico disponible. Luego procedí con una limpieza y eliminé muchos registros de las tablas en este espacio de tabla. Esperábamos ver un gran aumento en el espacio disponible. Desafortunadamente, cuando pregunté las vistas, noté que el espacio disponible era ahora del 20.5%.

¿Podría esto ser debido a la fragmentación de datos? ¿Podemos "desfragmentar" el espacio de tabla de alguna manera y recuperar el espacio perdido? ¿O necesitamos recrear el espacio de tabla desde cero?

Nuno Furtado
fuente

Respuestas:

14

Cuando elimina registros, no hay nada que compacte automáticamente el segmento, por lo tanto, deberá reducir el segmento para recuperar el espacio. Aquí hay un extracto de la Guía del administrador de 11.2 para reclamar espacio perdido :

Con el tiempo, las actualizaciones y eliminaciones en objetos dentro de un espacio de tabla pueden crear bolsas de espacio vacío que individualmente no son lo suficientemente grandes como para ser reutilizadas para nuevos datos. Este tipo de espacio vacío se conoce como espacio libre fragmentado.

Los objetos con espacio libre fragmentado pueden generar mucho espacio desperdiciado y pueden afectar el rendimiento de la base de datos. La forma preferida de desfragmentar y recuperar este espacio es realizar una reducción de segmento en línea. Este proceso consolida el espacio libre fragmentado debajo de la marca de límite superior y compacta el segmento. Después de la compactación, se mueve la marca de límite superior, lo que da como resultado un nuevo espacio libre por encima de la marca de límite superior. Ese espacio por encima de la marca de agua alta se desasigna. El segmento permanece disponible para consultas y DML durante la mayor parte de la operación, y no es necesario asignar espacio en disco adicional.

Más abajo en la misma página puedes leer esto:

La reducción de segmento es una operación en línea, en el lugar. Las operaciones y consultas DML se pueden emitir durante la fase de movimiento de datos de reducción de segmento. Las operaciones simultáneas de DML se bloquean por un corto tiempo al final de la operación de reducción, cuando el espacio se desasigna. Los índices se mantienen durante la operación de reducción y permanecen utilizables después de que se completa la operación. La reducción de segmento no requiere que se asigne espacio de disco adicional.

La reducción de segmento recupera el espacio no utilizado tanto por encima como por debajo de la marca de nivel superior. Por el contrario, la desasignación de espacio recupera el espacio no utilizado solo por encima de la marca de límite superior. En las operaciones de reducción, de forma predeterminada, la base de datos compacta el segmento, ajusta la marca de límite superior y libera el espacio recuperado.

La página incluye mucha más información sobre el tema, incluidos ejemplos.

La sección "Espacio del segmento y la marca de la marea alta" de la Guía de conceptos también puede ser útil.

Leigh Riffel
fuente
9

Sí, será debido a la fragmentación.

Para reclamar el espacio, primero obtenga una lista de tablas en el espacio de tabla con la siguiente consulta (ignorando las particiones: edite su pregunta si las está usando):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Luego, para cada tabla, habilite el movimiento de fila:

alter table TABLEINDATAPARTITION enable row movement;

Luego puede reducir la tabla:

alter table TABLEINDATAPARTITION shrink space;

Luego, reduzca los archivos de datos con:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Los nombres de los archivos de datos se pueden obtener de la DBA_DATA_FILESvista, que ya conoce.

Philᵀᴹ
fuente
Excelente, una respuesta práctica. +1
Leigh Riffel