Saltar al contenido principal
Uno de los secretos del rendimiento de las consultas en ClickHouse es la compresión. Menos datos en disco significan menos E/S y consultas e inserciones más rápidas. La sobrecarga en CPU de cualquier algoritmo de compresión, en la mayoría de los casos, queda compensada por la reducción de E/S. Por lo tanto, mejorar la compresión de los datos debe ser el primer objetivo al trabajar para garantizar que las consultas de ClickHouse sean rápidas.
Para entender por qué ClickHouse comprime los datos tan bien, recomendamos leer este artículo. En resumen, nuestra base de datos orientada a columnas escribe los valores por columnas. Cuando estos valores se ordenan, los valores idénticos quedan ubicados de forma contigua, y los algoritmos de compresión aprovechan esos patrones continuos en los datos. Además, ClickHouse dispone de codecs y tipos de datos más granulares que le permiten ajustar aún más la compresión con facilidad.
La compresión en ClickHouse se ve afectada por 3 factores principales:
  • La clave de ordenación
  • Los tipos de datos
  • Los codecs que se utilizan
Todos ellos se configuran a través del esquema.

Elija el tipo de dato adecuado para optimizar la compresión

Usemos el conjunto de datos de Stack Overflow como ejemplo. Comparemos las estadísticas de compresión de los siguientes esquemas para la tabla posts:
  • posts - Un esquema no optimizado en cuanto a tipos y sin clave de ordenación.
  • posts_v3 - Un esquema optimizado en cuanto a tipos, con el tipo y el tamaño en bits adecuados para cada columna, y con clave de ordenación (PostTypeId, toDate(CreationDate), CommentCount).
Con las siguientes consultas, podemos medir el tamaño comprimido y sin comprimir actual de cada columna. Examinemos el tamaño del esquema inicial optimizado posts sin clave de ordenación.
Si ves valores de compressed_size o uncompressed_size iguales a 0, puede deberse a que el tipo de las partes es compact y no wide (consulta la descripción de part_type en system.parts). El formato de la parte está controlado por la configuración min_bytes_for_wide_part y min_rows_for_wide_part, lo que significa que, si los datos insertados dan como resultado una parte que no supera los valores de la configuración mencionada, la parte será compact en lugar de wide y no verás los valores de compressed_size o uncompressed_size.Para demostrarlo:
Consulta
Respuesta
Aquí mostramos tanto el tamaño comprimido como el tamaño sin comprimir. Ambos son importantes. El tamaño comprimido corresponde a lo que tendremos que leer del disco, algo que queremos minimizar para mejorar el rendimiento de las consultas (y reducir el coste de almacenamiento). Estos datos deberán descomprimirse antes de poder leerse. El tamaño sin comprimir dependerá, en este caso, del tipo de dato utilizado. Minimizar este tamaño reducirá la sobrecarga de memoria de las consultas y la cantidad de datos que debe procesar la consulta, lo que mejorará el uso de la caché y, en última instancia, los tiempos de consulta.
La consulta anterior se basa en la tabla columns de la base de datos del sistema. Esta base de datos la administra ClickHouse y es una auténtica mina de información útil, desde métricas de rendimiento de consultas hasta logs en segundo plano del cluster. Recomendamos “System Tables and a Window into the Internals of ClickHouse” y los artículos complementarios[1][2] para quien quiera profundizar.
Para resumir el tamaño total de la tabla, podemos simplificar la consulta anterior:
Al repetir esta consulta con posts_v3, la tabla con un tipo y una clave de ordenación optimizados, podemos ver una reducción significativa en los tamaños sin comprimir y comprimido.
El desglose completo por columnas muestra un ahorro considerable en las columnas Body, Title, Tags y CreationDate, gracias a la ordenación de los datos antes de la compresión y al uso de los tipos adecuados.

Elegir el códec de compresión de columna adecuado

Con los códecs de compresión de columnas, podemos cambiar el algoritmo (y su configuración) que se utiliza para codificar y comprimir cada columna. La codificación y la compresión funcionan de forma ligeramente distinta, aunque persiguen el mismo objetivo: reducir el tamaño de los datos. Las codificaciones aplican una transformación a los datos, modificando los valores según una función y aprovechando las propiedades del tipo de dato. En cambio, la compresión utiliza un algoritmo genérico para comprimir los datos a nivel de bytes. Por lo general, primero se aplican las codificaciones y después la compresión. Como distintas codificaciones y algoritmos de compresión resultan eficaces con diferentes distribuciones de valores, es importante comprender bien los datos. ClickHouse admite una gran variedad de códecs y algoritmos de compresión. A continuación se muestran algunas recomendaciones en orden de importancia: Consulte aquí para ver más opciones. A continuación especificamos el códec Delta para Id, ViewCount y AnswerCount, partiendo de la hipótesis de que estarán linealmente correlacionados con la clave de ordenación y, por tanto, deberían beneficiarse de la codificación Delta.
Las mejoras de compresión para estas columnas se muestran a continuación:

Compresión en ClickHouse Cloud

En ClickHouse Cloud, usamos por defecto el algoritmo de compresión ZSTD (con un valor predeterminado de 1). Aunque la velocidad de compresión de este algoritmo puede variar según el nivel de compresión (a mayor nivel, menor velocidad), tiene la ventaja de mantener un rendimiento de descompresión sistemáticamente alto (con una variación de alrededor del 20 %) y de poder paralelizarse. Nuestras pruebas históricas también indican que este algoritmo suele ser lo bastante eficaz e incluso puede superar a LZ4 combinado con un códec. Funciona bien con la mayoría de los tipos de datos y distribuciones de datos, por lo que es una opción predeterminada sensata para uso general; de ahí que nuestra compresión inicial ya sea excelente incluso sin optimización.
Última modificación el 19 de junio de 2026