ClickHouse se vuelve más perezoso y más rápido: introduce la optimización de carga diferida
(clickhouse.com)- ClickHouse introdujo una nueva técnica de optimización, lazy materialization, que mejora el rendimiento de las consultas
Top Nhasta 1,500 veces - La estrategia de leer los datos de columnas solo cuando se necesitan minimiza el I/O de disco
- Junto con las técnicas existentes de almacenamiento columnar, índices y PREWHERE, forma una pila jerárquica de optimización de I/O
- Carga de forma diferida los datos de columnas según el plan de ejecución de la consulta, por lo que resulta especialmente efectiva en consultas con cláusula LIMIT
- Está habilitada por defecto, así que se puede obtener una mejora de rendimiento sin cambiar el código
La estrategia de optimización diferida de ClickHouse: Lazy Materialization
Concepto clave
- ClickHouse maximiza el rendimiento evitando leer datos innecesarios
- lazy materialization carga los datos de columnas solo en el momento en que realmente se necesitan durante la ejecución de la consulta
- Funciona de manera independiente de las técnicas existentes de optimización de I/O, a la vez que ofrece mejoras de rendimiento complementarias
Tecnologías existentes de optimización de I/O
- Almacenamiento basado en columnas: lee solo las columnas necesarias
- Sparse Index / Skipping Index / Projections: lee solo los granules que coinciden con las condiciones filtradas
- PREWHERE: filtra temprano columnas no indexadas
- Query Condition Cache: almacena en caché los resultados de consultas repetidas para evitar reprocesar los mismos granules
Cómo funciona Lazy Materialization
- Mientras que las técnicas anteriores se enfocaban en reducir I/O mediante filtrado, lazy materialization pospone la lectura hasta el momento del procesamiento
- Lee de inmediato solo las columnas que necesita la siguiente etapa de la consulta, y deja el resto para después de LIMIT, cuando haga falta
- Es especialmente útil en consultas Top N, porque solo se revisan algunas columnas y por eso casi no necesita leer columnas de texto grandes
Es una optimización posible gracias al almacenamiento independiente por columnas, y un enfoque imposible en bases de datos orientadas a filas
Ejemplo real: conjunto de datos de reseñas de Amazon
-
150M rows, 70GB sin comprimir, 30GB comprimidos
-
Ejemplo de consulta Top N:
SELECT helpful_votes FROM amazon.amazon_reviews ORDER BY helpful_votes DESC LIMIT 3;- Tiempo de ejecución: 0.07 segundos
- Procesamiento rápido al consultar una sola columna
-
Ejemplo de consulta de una columna de texto grande:
SELECT review_body FROM amazon.amazon_reviews FORMAT Null;- Tiempo de ejecución: 176 segundos
- Aunque es una sola columna, al tener 56GB genera un cuello de botella de I/O de disco
Comparación de rendimiento según la capa de optimización aplicada
1. Sin optimización (Baseline)
- Tiempo de ejecución: 219 segundos
- Volumen procesado: 72GB, 150M rows
- Lee y ordena todas las columnas completas
2. Con Primary Key Index
- Tiempo de ejecución: 96 segundos
- Volumen procesado: 28GB, 53M rows
- El filtrado de granules basado en PK reduce el tiempo en más de 50%
3. Agregando PREWHERE
- Tiempo de ejecución: 61 segundos
- Volumen procesado: 16GB
- Reduce aún más el I/O al aplicar también condiciones de filtro no indexadas
4. Activando Lazy Materialization
- Tiempo de ejecución: 0.18 segundos
- Volumen procesado: 807MB
- Al final, solo carga desde las columnas grandes las 3 rows realmente necesarias
En total, más de 1,200 veces de mejora de rendimiento y más de 150 veces menos uso de memoria
También es efectiva en consultas Top N sin filtros
-
En una consulta de ordenamiento completo sin filtros:
SELECT helpful_votes, product_title, review_headline, review_body FROM amazon.amazon_reviews ORDER BY helpful_votes DESC LIMIT 3; -
Antes de lazy materialization: 219 segundos
-
Después de lazy materialization: 0.139 segundos
-
1,576 veces más rápida, 40 veces menos I/O y 300 veces menos uso de memoria
Verificación del plan de ejecución
EXPLAIN actions = 1
SELECT helpful_votes, product_title, review_headline, review_body
FROM amazon.amazon_reviews
ORDER BY helpful_votes DESC
LIMIT 3
SETTINGS query_plan_optimize_lazy_materialization = true;
- Resultado:
Lazily read columns: review_headline, review_body, product_title
Limit
Sorting
ReadFromMergeTree
- Las columnas grandes se cargan solo después del ordenamiento y LIMIT
Conclusión
- Se completa la pila de optimización de I/O de ClickHouse: Index → PREWHERE → Lazy Materialization
- Sin cambiar el código, solo con la forma de ejecutar la consulta, el rendimiento puede mejorar de cientos a miles de veces
- Es ideal especialmente para patrones Top N, columnas de gran tamaño y consultas con LIMIT
- Está habilitada por defecto, así que se aplica automáticamente sin que el usuario tenga que configurarla
El mismo SQL, la misma máquina, resultados distintos
Más rápido = menos lectura = ClickHouse
2 comentarios
> Me pregunto si alguien ha comparado ClickHouse con StarRocks; hace unos meses, el rendimiento de los joins de StarRocks parecía mejor.
https://d2.naver.com/helloworld/1168674
Comentarios de Hacker News
Esta optimización probablemente ofrecerá mejoras dramáticas de velocidad al extraer muestras aleatorias de conjuntos de datos grandes, especialmente cuando las columnas de interés puedan contener valores grandes
LIMITpara determinar qué filas se incluirán en la muestraLIMITfiltre el conjunto de datos a unas pocas filasRealmente me encanta ClickHouse
No puedo entender los sitios web que no se pueden desplazar
Materialización tardía, 19 años después
No está relacionado con la nueva opción de materialización, pero esta parte me llamó la atención
Si ClickHouse tuviera una versión nativa para Windows que no requiriera WSL ni una máquina virtual de Linux, probablemente sería más popular que DuckDB
A pesar del drama del aeropuerto, estoy planeando unas vacaciones en la playa
ClickHouse es una obra maestra de la ingeniería moderna
Me pregunto si alguien ha comparado ClickHouse con StarRocks
Es sorprendente cómo estas bases de datos demuestran lo equivocado que estaba todo en las bases de datos orientadas a filas