Seguro que en más de una ocasión hemos eliminado registros de una tabla en grandes cantidades, quizás millones. Una vez hecho esto lo esperable sería una reducción del espacio ocupado en el tablespaces, pero esto no es así, las extensiones siguen existiendo pero libres para el uso de la tabla en cuestión, no las puede usar otra tabla.
Una vez eliminados los millones de registros, se ha de compactar la tabla para devolver espacio libre al tablespace, una vez hecho esto incluso podemos reducir el tamaño de los datafiles sin encontrarnos con la limitación impuesta por el HIGH WATER MARK (tamaño máximo alcanzado por los objetos dentro de un datafile).
Supongamos la tabla:
scott.test
Hay que hacer dos cosas para compactar la tabla y devolver el espacio libre: activar el movimiento de rows y la compactación/contracción de la tabla.
ALTER TABLE scott.test ENABLE ROW MOVEMENT;
ALTER TABLE scott.test SHRINK SPACE;
Un detalle importante a tener en cuenta es que luego hay que reconstruir todos los índices de la tabla con:
ALTER INDEX scott.idx1_test REBUILD;
Este último paso es importantísimo, depués de una compactación de la tabla los rowid han cambiar, piensa que un rowid es la descripción física de donde está el registro en cuestión y los índices almacenan rowids.
En alguna publicaciones he visto que han de incluir la palabra COMPACT porque?
alter table tabla enable row movement;
alter table tabla shrink space compact;
alter table tabla shrink space
Si añades la La palabra clave COMPACT, realmente Oracle realiza menos operaciones. El compactado se produce pero lo que no se realiza es la modificación en el high water mark de la tabla, vamos que a efectos prácticos la tabla sigue ocupando lo que ocupada.
COMPACT está pensado para realizar el compactado de dos pasos:
1-ALTER TABLE scott.test SHRINK SPACE COMPACT; –solo compactación
2-ALTER TABLE scott.test SHRINK SPACE; –compactación, que sería muy rápida porque ya está, y reducción del high water mark.
Este es el link de la documentación:
http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_3001.htm#i2192484
Hola buenas tardes, despues de realizar esto, yo necesito reducir espacio en disco, y entregar a sistema operativo el espacio liberado, esto como lo realizo????
Es cierto es un pequeño detalle que me dejé en el momento de escribir la entrada. Lo que hay que ejecutar es:
ALTER DATABASE DATAFILE ‘/u02/oracle/rbdb1/stuff01.dbf’ RESIZE 100M;
Sustituyendo el datafile y el tamaño por los deseados.
El link de la documentación oficial es:
https://docs.oracle.com/cd/B28359_01/server.111/b28310/dfiles003.htm#i1006333