Hybrid Columnar Compression (HCC) es una tecnología de compresión avanzada introducida por Oracle, especialmente diseñada para entornos como Oracle Exadata.
A diferencia de las bases de datos tradicionales con formato mayoritario de filas, HCC organiza los datos en un formato mayoritario de columnas dentro de unidades de almacenamiento conocidas como unidades de compresión (CU).
Este formato permite a Oracle comprimir los datos con mayor eficacia, lo que mejora tanto la utilización del almacenamiento como el rendimiento de las consultas, especialmente en operaciones de lectura intensiva como el almacenamiento y archivo de datos.
Índice
El HCC se presenta en cuatro tipos de compresión:
- Consulta Baja: Utiliza la compresión LZO (Lempel-Ziv-Oberhumer), que ofrece una descompresión rápida pero unos ratios de compresión más bajos. Es ideal para situaciones en las que la velocidad es esencial, especialmente para el acceso a nivel de fila.
- Consulta Alta: Utiliza compresión ZLIB (Gzip), proporcionando mejores ratios de compresión que Query Low pero requiriendo más CPU para la descompresión.
- Archivo Bajo: Utiliza una versión más agresiva del algoritmo ZLIB, optimizando para una mayor compresión que Query High pero a costa de una sobrecarga de CPU aún mayor.
- Archivo Alto: Esta es la forma más agresiva de compresión, utilizando el algoritmo Bzip2. Proporciona el mayor ratio de compresión, pero también incurre en el mayor coste de CPU y es la más adecuada para datos a los que se accede raramente.
Para utilizar HCC, debe estar habilitado en Exadata o en determinados sistemas de almacenamiento de Oracle (como Oracle ZFS Storage).
Puede activar HCC al crear una tabla o modificando una ya existente.
He aquí un ejemplo:
CREATE TABLE my_table
COLUMN STORE COMPRESS FOR ARCHIVE HIGH
AS SELECT * FROM source_table;
La compresión también puede aplicarse a las particiones de una tabla.
Tenga en cuenta que la compresión HCC beneficia principalmente a las cargas de trabajo con grandes conjuntos de datos de sólo lectura, y es menos adecuada para los datos que se actualizan con frecuencia debido a la posible degradación del rendimiento.
Además, las operaciones de ruta directa son necesarias para insertar datos en tablas comprimidas con HCC.
Las actualizaciones de las filas comprimidas con HCC se almacenan por separado, lo que a menudo requiere más almacenamiento y reduce las ventajas de la compresión original.
1. Los 4 tipos de compresión HCC
A continuación se muestran ejemplos de cómo crear tablas utilizando los cuatro tipos diferentes de Compresión Columnar Híbrida (HCC) en Oracle:
1. Consulta Baja Compresión
Este tipo de compresión ofrece un equilibrio entre rendimiento y ratio de compresión, adecuado para accesos frecuentes y tiempos de respuesta de consulta más rápidos.
CREATE TABLE my_table_query_low
COLUMN STORE COMPRESS FOR QUERY LOW
AS SELECT * FROM source_table;
2. Consulta Alta Compresión
Esta compresión proporciona un mayor ratio de compresión que Query Low, pero con más sobrecarga para la descompresión.
Es adecuado para conjuntos de datos que se leen con más frecuencia pero que no requieren el máximo rendimiento.
CREATE TABLE my_table_query_high
COLUMN STORE COMPRESS FOR QUERY HIGH
AS SELECT * FROM source_table;
3. Archivo Baja compresión
Esta compresión se utiliza cuando se necesita almacenar datos durante largos periodos con mejor compresión que Query High, pero aún con un rendimiento decente cuando se consulta.
CREATE TABLE my_table_archive_low
COLUMN STORE COMPRESS FOR ARCHIVE LOW
AS SELECT * FROM source_table;
4. Archivo Alta compresión
Es la compresión más agresiva y ofrece la relación de compresión más alta.
Es ideal para datos archivados o a los que se accede con poca frecuencia.
CREATE TABLE my_table_archive_high
COLUMN STORE COMPRESS FOR ARCHIVE HIGH
AS SELECT * FROM source_table;
En estos ejemplos, cada tabla se crea a partir de una tabla existente (tabla_fuente
), y se aplica el tipo de compresión HCC específico para optimizar el almacenamiento en función del caso de uso.
En COLUMNA ALMACENAR COMPRIMIR
aplica el nivel de compresión HCC deseado.
5. Cómo crear la tabla_fuente
He aquí una sencilla CREAR TABLA
para el tabla_fuente
que podemos utilizar como tabla de referencia para los ejemplos de compresión HCC.
Esta tabla contiene columnas de ejemplo que representan tipos de datos típicos.
CREATE TABLE source_table (
id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
email VARCHAR2(100),
created_at DATE,
amount NUMBER(10, 2)
);
Este tabla_fuente
contiene algunos campos básicos: un id
, nombre
, apellido
, correo electrónico
, fecha_de_creación
(para la fecha de entrada), y importe
.
Puede rellenar esta tabla con datos y utilizarla como base para aplicar los distintos tipos de compresión columnar híbrida (HCC).
6. Cómo rellenar la tabla_fuente
Para rellenar el tabla_fuente
con millones de filas en Oracle, puede utilizar un bloque PL/SQL combinado con bucles y la función DBMS_RANDOM
para generar datos aleatorios.
He aquí un ejemplo que insertará 1 millón de filas en la tabla:
BEGIN
FOR i IN 1..1000000 LOOP
INSERT INTO source_table (
id, first_name, last_name, email, created_at, amount
)
VALUES (
i,
DBMS_RANDOM.STRING('U', 10), -- Random first name
DBMS_RANDOM.STRING('U', 10), -- Random last name
DBMS_RANDOM.STRING('U', 10) || '@example.com', -- Random email
SYSDATE - DBMS_RANDOM.VALUE(0, 365), -- Random date in the past year
ROUND(DBMS_RANDOM.VALUE(1, 10000), 2) -- Random amount between 1 and 10000
);
-- Commit every 10,000 rows for performance reasons
IF MOD(i, 10000) = 0 THEN
COMMIT;
END IF;
END LOOP;
-- Final commit in case the loop ends without hitting a commit
COMMIT;
END;
/
7. Cómo comprobar el tipo de compresión de cada tabla
Para verificar el tipo de compresión aplicado a cada tabla, puede consultar las vistas del diccionario de datos de Oracle.
En concreto, puede utilizar la función DBA_TABLES
ver o TODAS LAS TABLAS
para comprobar la COMPRESIÓN
y COMPRIMIR_FOR
columnas.
A continuación se explica cómo comprobar el tipo de compresión de cada tabla:
SELECT table_name, compression, compress_for
FROM dba_tables
WHERE table_name IN ('MY_TABLE_QUERY_LOW', 'MY_TABLE_QUERY_HIGH', 'MY_TABLE_ARCHIVE_LOW', 'MY_TABLE_ARCHIVE_HIGH');
Ejemplo de salida:
NOMBRE_TABLA | COMPRESIÓN | COMPRIMIR_FOR |
---|
MI_TABLA_CONSULTA_BAJA | ACTIVADO | CONSULTA BAJA |
MI_TABLA_CONSULTA_ALTA | ACTIVADO | CONSULTA ALTA |
MI_TABLA_ARCHIVO_BAJO | ACTIVADO | ARCHIVO BAJA |
MI_TABLA_ARCHIVO_ALTO | ACTIVADO | ARCHIVO ALTO |
2. Cómo comprobar los beneficios de la compresión HCC
Para comprobar las ventajas de la compresión columnar híbrida (HCC), puede utilizar varios métodos para medir el ahorro de espacio y comparar el almacenamiento utilizado antes y después de la compresión.
A continuación se presentan algunos métodos para evaluar los beneficios de la compresión:
1. Consulta DBA_SEGMENTOS
Comparar tamaños de mesa
Puede comprobar el tamaño real de la tabla en términos de segmentos (es decir, el almacenamiento utilizado) y comparar los tamaños de las tablas con y sin compresión.
SELECT segment_name, segment_type, (bytes)/1024/1024 AS size_mb
FROM dba_segments
WHERE segment_name IN ('MY_TABLE_QUERY_LOW', 'MY_TABLE_QUERY_HIGH', 'MY_TABLE_ARCHIVE_LOW', 'MY_TABLE_ARCHIVE_HIGH');
Esta consulta mostrará el tamaño (en MB) de cada tabla, lo que le permitirá comparar cuánto espacio de almacenamiento ocupa cada tabla comprimida.
2. Paquete DBMS_COMPRESSION
Oracle proporciona el DBMS_COMPRESSION
para analizar el ahorro real de espacio gracias a la compresión. Puede utilizar este paquete para obtener información detallada sobre los ratios de compresión y sus ventajas. A continuación se explica cómo utilizarlo:
DECLARE
blk_compress_ratio NUMBER;
blk_comp_ops NUMBER;
blk_comp_ratio_rows NUMBER;
blk_uncomp_ops NUMBER;
blk_uncomp_ratio_rows NUMBER;
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO(
schema_name => 'YOUR_SCHEMA_NAME',
object_name => 'MY_TABLE_QUERY_LOW',
subobject_name => NULL,
object_type => DBMS_COMPRESSION.TABLE,
blk_compress_ratio => blk_compress_ratio,
blk_comp_ops => blk_comp_ops,
blk_comp_ratio_rows => blk_comp_ratio_rows,
blk_uncomp_ops => blk_uncomp_ops,
blk_uncomp_ratio_rows => blk_uncomp_ratio_rows
);
DBMS_OUTPUT.PUT_LINE('Compression Ratio: ' || blk_compress_ratio);
DBMS_OUTPUT.PUT_LINE('Uncompressed Size: ' || blk_uncomp_ops);
DBMS_OUTPUT.PUT_LINE('Compressed Size: ' || blk_comp_ops);
END;
/
3. Utilice el Asesor de compresión (DBMS_COMPRESSION.ADVISOR
)
Oracle DBMS_COMPRESSION.ADVISOR
ofrece estimaciones sobre las prestaciones por compresión que puede obtener de la HCC.
Puede utilizar este paquete para comprobar el ahorro de espacio previsto.
Aquí tienes un ejemplo de cómo utilizarlo:
DECLARE
comp_ratio NUMBER;
comp_method VARCHAR2(100);
BEGIN
comp_method := DBMS_COMPRESSION.COMP_FOR_QUERY_HIGH;
comp_ratio := DBMS_COMPRESSION.ADVISOR (
schema_name => 'YOUR_SCHEMA',
table_name => 'MY_TABLE_QUERY_HIGH',
compress_for => comp_method
);
DBMS_OUTPUT.PUT_LINE('Expected Compression Ratio for ' || comp_method || ': ' || comp_ratio);
END;
/
4. Comprobar la compresión real de las filas
Puede obtener la longitud media de las filas antes y después de la compresión para evaluar cuánto espacio ocupa cada fila:
Antes de la compresión:
SELECT AVG(vsize(id) + vsize(first_name) + vsize(last_name) + vsize(email) + vsize(created_at) + vsize(amount)) AS avg_row_length
FROM source_table;
Después de la compresión:
SELECT AVG(vsize(id) + vsize(first_name) + vsize(last_name) + vsize(email) + vsize(created_at) + vsize(amount)) AS avg_row_length
FROM MY_TABLE_QUERY_HIGH;
5. Control del uso del almacenamiento a lo largo del tiempo
Puede capturar periódicamente las métricas de uso del almacenamiento antes y después de cargar los datos en tablas comprimidas y comparar cómo crece el almacenamiento de las tablas comprimidas frente a las no comprimidas.
Utilizando estos métodos, podrá evaluar el ahorro real de espacio y las ventajas que ofrece la compresión columnar híbrida en su entorno.
En DBA_SEGMENTOS
le ayuda a ver los tamaños reales, y la vista DBMS_COMPRESSION
ofrece un desglose detallado de las relaciones de compresión.