Saltar al contenido principal
Este artículo describe cómo funciona la materialización diferida y cómo encaja en el conjunto más amplio de optimizaciones de E/S de ClickHouse. Presenta un ejemplo real que demuestra cómo la materialización diferida mejora el rendimiento de las consultas.
Disponible a partir de la versión 25.4La materialización diferida se introdujo en la versión 25.4 de ClickHouse y está activada de forma predeterminada.

Descripción general

A lo largo de los años, ClickHouse ha incorporado una serie de optimizaciones por capas para reducir agresivamente la E/S. Estas técnicas constituyen la base de su velocidad y eficiencia: Aunque las optimizaciones de E/S mencionadas pueden reducir significativamente la cantidad de datos leídos, siguen partiendo de que todas las columnas de las filas que cumplen la cláusula WHERE deben cargarse antes de ejecutar operaciones como la ordenación, la aggregation o LIMIT. Pero ¿qué ocurre si algunas columnas no se necesitan hasta más adelante, o si ciertos datos, pese a cumplir la cláusula WHERE, no llegan a necesitarse en absoluto? Ahí es donde entra la materialización diferida. Se trata de una mejora ortogonal que completa el conjunto de optimizaciones de E/S:
  • La indexación, junto con PREWHERE, garantiza que solo se procesen las filas que coinciden con los filtros de columna de la cláusula WHERE.
  • La materialización diferida amplía este enfoque al aplazar la lectura de columnas hasta que el plan de ejecución de la consulta realmente las necesite. Incluso después del filtrado, solo se cargan de inmediato las columnas necesarias para la siguiente operación, como la ordenación. Las demás se posponen y, debido a LIMIT, a menudo solo se leen parcialmente, lo justo para producir el resultado final. Esto hace que la materialización diferida sea especialmente potente para las consultas Top N, donde el resultado final puede requerir solo un puñado de filas de determinadas columnas, a menudo grandes.

Un ejemplo práctico

Recomendamos encarecidamente el artículo del blog “ClickHouse gets lazier (and faster): Introducing lazy materialization” para profundizar en la materialización diferida. El ejemplo siguiente se ha tomado del artículo mencionado y se reproduce aquí para mostrar cómo una consulta de ClickHouse puede pasar de 219 segundos a solo 139 milisegundos (una aceleración de 1576×) con materialización diferida. Para beneficiarse de la indexación y de PREWHERE, una consulta necesita filtros: en las columnas de la clave primaria para la indexación y en cualquier columna para PREWHERE. La materialización diferida se integra limpiamente con estas optimizaciones, pero, a diferencia de las otras optimizaciones mencionadas antes, también puede acelerar consultas sin ningún filtro de columna. Considere la siguiente consulta de ejemplo, que encuentra las reseñas de Amazon con el mayor número de votos útiles, independientemente de la fecha, el producto, la calificación o el estado de verificación, y devuelve las 3 primeras junto con su título, encabezado y texto completo. Primero, ejecute la consulta (con las cachés del sistema de archivos en frío) con la materialización diferida desactivada (mediante query_plan_optimize_lazy_materialization):
Query
Response
A continuación, se vuelve a ejecutar la consulta (de nuevo con la caché del sistema de archivos en frío), pero esta vez con la materialización diferida habilitada:
Query
Normalmente, no necesitas configurar explícitamente query_plan_optimize_lazy_materialization = true para beneficiarte de la materialización diferida. Está habilitada de forma predeterminada.
Response
Observe la diferencia de rendimiento con la materialización diferida desactivada y activada:

Cómo confirmar la materialización diferida en el plan de ejecución de la consulta

Puede comprobar el uso de la materialización diferida en la consulta anterior inspeccionando su plan lógico de ejecución mediante la cláusula EXPLAIN:
Puede leer el plan de operadores de abajo hacia arriba y observar que ClickHouse aplaza la lectura de las tres columnas grandes de tipo String hasta después de ordenar y limitar.
Última modificación el 1 de julio de 2026