Comprimir tablas es una forma eficiente de reducir espacio de almacenamiento utilizado por los segmentos de tablas, indices, particiones , etc.
Oracle ha introducido este concepto desde las 9i y conforme han salido las nueva versiones ha ido incluyendo mejoras, pero como toda buena característica de Oracle solo aplica para version enterprise.
Se puede aplicar según sea la necesidad y donde se pueda aplicar, como por ejemplo en datos que representen historia así como particiones.
La compresión de las tablas se puede realizar en la creación o después de la creación.
Creacion
Vamos a realizar el ejemplo de crear dos tabla una sin compresión y otra con compresión.
La compresión de las tablas se puede realizar en la creación o después de la creación.
Creacion
Vamos a realizar el ejemplo de crear dos tabla una sin compresión y otra con compresión.
--SIN COMPRESION
CREATE TABLE TEST_TAB_NOCOMPRESS( NUMERO INTEGER, DATO VARCHAR2(600), FECHA DATE) TABLESPACE USERS;
--COMPRESA
CREATE TABLE TEST_TAB_COMPRESS( NUMERO INTEGER, DATO VARCHAR2(600), FECHA DATE) TABLESPACE USERS COMPRESS;Realizaremos la inserción de datos.
SET TIMING ON
insert into TEST_TAB_NOCOMPRESS (NUMERO,DATO,FECHA) SELECT ROWNUM, LPAD('X',500,'A'),SYSDATE FROM DUAL CONNECT BY LEVEL <=1000000;
1000000 rows created.
Elapsed: 00:01:01.05
insert into TEST_TAB_COMPRESS (NUMERO,DATO,FECHA) SELECT ROWNUM, LPAD('X',500,'A'),SYSDATE FROM DUAL CONNECT BY LEVEL <=1000000;
1000000 rows created.
Elapsed: 00:01:04.47
--actualizamos estadisticas
analyze table TEST_TAB_NOCOMPRESS compute statistics;analyze table TEST_TAB_COMPRESS compute statistics;
Revisemos el espacio usado y la cantidad de registros
Espacio usado
SELECT SEGMENT_NAME, BYTES/(1024*1024)MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')
SEGMENT_NAME MB
TEST_TAB_NOCOMPRESS 610
TEST_TAB_COMPRESS 528
Registros
SELECT TABLE_NAME, NUM_ROWS, COMPRESSION, COMPRESS_FOR FROM DBA_TABLES WHERE TABLE_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')
TABLE_NAME NUM_ROWS COMPRESSION COMPRESS_FOR
TEST_TAB_NOCOMPRESS 1000000 DISABLED
TEST_TAB_COMPRESS 1000000 ENABLED BASIC
Como nos hemos dado cuenta la tabla compresa tiene 82M menos que sin compresión un 13% menos.
No es mucho verdad? pues si por lo único que tiene la tabla TEST_TAB_COMPRESS es un pctfree 0 que hace uso al máximo del bloque para los registros.
Para poder hacer mas efectivo la compresión debemos hacer efectiva la compresión de los datos con un MOVE COMPRESS.
--COMPRIMIR
ALTER TABLE TEST_TAB_COMPRESS MOVE COMPRESS;
--Vemos el tamaño reducido
SELECT SEGMENT_NAME, BYTES/(1024*1024)MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')
SEGMENT_NAME MB
TEST_TAB_COMPRESS 12
TEST_TAB_NOCOMPRESS 610
Ahora si podemos ver que es mas efectiva la compresión de los datos de 12M llegando a un 98% de reducción de la tabla no compresa. Esta optimización dependerá de los datos y según la empresa o negocio va a variar.
Alterar tabla para la compresion.
Si queremos comprimir una tabla lo hacemos con el MOVE COMPRESS.
--COMPRIMIR
ALTER TABLE TEST_TAB_NOCOMPRESS MOVE COMPRESS;
SELECT SEGMENT_NAME, BYTES/(1024*1024)MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')
SEGMENT_NAME MB
TEST_TAB_COMPRESS 12
TEST_TAB_NOCOMPRESS 12
Consideraciones
- Solo para ediciones enterprise
- No esta diseñada para base de datos OLTP(BD Transaccionales) sino para cargas directas de base de datos OLAP(BD para analitica de datos)
- En version 11g o superior se implementa la compresion OLTP. Esto permite realizar transacciones DML.
- La compresion de los datos varia según los datos.