jueves, 9 de abril de 2020

Comprimir tablas Oracle -Compress Table

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.
--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.