Saltar al contenido principal
Las vistas materializadas actualizables son conceptualmente similares a las vistas materializadas de las bases de datos OLTP tradicionales: almacenan el resultado de una consulta específica para recuperarlo rápidamente y reducir la necesidad de ejecutar repetidamente consultas que consumen muchos recursos. A diferencia de las vistas materializadas incrementales de ClickHouse, estas requieren la ejecución periódica de la consulta sobre el conjunto de datos completo; los resultados se almacenan en una tabla de destino para su consulta. En teoría, este conjunto de resultados debería ser más pequeño que el conjunto de datos original, lo que permite que las consultas posteriores se ejecuten más rápido. El diagrama explica cómo funcionan las vistas materializadas actualizables: También puede ver el siguiente video:

¿Cuándo se deben usar las vistas materializadas actualizables?

Las vistas materializadas incrementales de ClickHouse son extremadamente potentes y, por lo general, escalan mucho mejor que el enfoque utilizado por las vistas materializadas actualizables, especialmente cuando se necesita realizar una agregación sobre una sola tabla. Al calcular la agregación únicamente sobre cada bloque de datos a medida que se inserta y fusionar los estados incrementales en la tabla final, la consulta solo se ejecuta sobre un subconjunto de los datos. Este método puede escalar hasta petabytes de datos y suele ser el método preferido. Sin embargo, hay casos de uso en los que este proceso incremental no es necesario o no resulta aplicable. Algunos problemas son incompatibles con un enfoque incremental o no requieren actualizaciones en tiempo real, por lo que una reconstrucción periódica es más apropiada. Por ejemplo, puede que quiera volver a calcular regularmente una vista completa sobre todo el conjunto de datos porque utiliza un JOIN complejo, lo cual es incompatible con un enfoque incremental.
Las vistas materializadas actualizables pueden ejecutar procesos por lotes que realizan tareas como la desnormalización. Se pueden crear dependencias entre vistas materializadas actualizables, de modo que una vista dependa de los resultados de otra y solo se ejecute cuando esta haya finalizado. Esto puede sustituir flujos de trabajo programados o DAG sencillos, como un job de dbt. Para obtener más información sobre cómo establecer dependencias entre vistas materializadas actualizables, consulte CREATE VIEW, sección Dependencies.

¿Cómo se actualiza una vista materializada actualizable?

Las vistas materializadas actualizables se actualizan automáticamente según un intervalo definido durante su creación. Por ejemplo, la siguiente vista materializada se actualiza cada minuto:
Si desea forzar la actualización de una vista materializada, puede usar la cláusula SYSTEM REFRESH VIEW:
También puedes cancelar, detener o iniciar una vista. Para obtener más información, consulta la documentación sobre la gestión de vistas materializadas actualizables.

¿Cuándo se actualizó por última vez una vista materializada actualizable?

Para saber cuándo se actualizó por última vez una vista materializada actualizable, puede consultar la tabla del sistema system.view_refreshes, como se muestra a continuación:

¿Cómo puedo cambiar la frecuencia de actualización?

Para cambiar la frecuencia de actualización de una vista materializada actualizable, utilice la sintaxis ALTER TABLE...MODIFY REFRESH.
Una vez hecho esto, puedes usar la consulta ¿Cuándo se actualizó por última vez una vista materializada actualizable? para comprobar que la frecuencia se ha actualizado:

Uso de APPEND para añadir nuevas filas

La funcionalidad APPEND permite añadir nuevas filas al final de la tabla en lugar de reemplazar toda la vista. Uno de los usos de esta funcionalidad es capturar instantáneas de valores en un momento determinado. Por ejemplo, imaginemos que tenemos una tabla events alimentada por un flujo de mensajes de Kafka, Redpanda u otra plataforma de datos en streaming.
Este conjunto de datos tiene 4096 valores en la columna uuid. Podemos escribir la siguiente consulta para encontrar los que tienen el mayor recuento total:
Supongamos que queremos registrar el recuento de cada uuid cada 10 segundos y almacenarlo en una nueva tabla llamada events_snapshot. El esquema de events_snapshot tendría este aspecto:
A continuación, podríamos crear una vista materializada actualizable para poblar esta tabla:
Luego podemos consultar events_snapshot para obtener el recuento a lo largo del tiempo de un uuid específico:

Ejemplos

Veamos ahora cómo usar vistas materializadas actualizables con algunos conjuntos de datos de ejemplo.

Stack Overflow

La guía de desnormalización de datos muestra varias técnicas para desnormalizar datos usando un conjunto de datos de Stack Overflow. Cargamos datos en las siguientes tablas: votes, users, badges, posts y postlinks. En esa guía, mostramos cómo desnormalizar los datos de postlinks en la tabla posts con la siguiente consulta:
Luego mostramos cómo hacer una inserción puntual de estos datos en la tabla posts_with_links, pero en un sistema de producción querríamos ejecutar esta operación periódicamente. Tanto la tabla posts como postlinks podrían actualizarse. Por lo tanto, en lugar de intentar implementar este JOIN mediante vistas materializadas incrementales, puede ser suficiente simplemente programar esta consulta para que se ejecute a intervalos fijos, por ejemplo, una vez por hora, almacenando los resultados en una tabla post_with_links. Aquí es donde resulta útil una vista materializada actualizable, y podemos crear una con la siguiente consulta:
La vista se ejecutará de inmediato y, a partir de entonces, cada hora, según la configuración, para garantizar que se reflejen las actualizaciones de la tabla de origen. Es importante destacar que, cuando la consulta vuelve a ejecutarse, el conjunto de resultados se actualiza de forma atómica y transparente.
La sintaxis aquí es idéntica a la de una vista materializada incremental, salvo que incluimos una cláusula REFRESH:

IMDb

En la guía de integración de dbt y ClickHouse rellenamos un conjunto de datos de IMDb con las siguientes tablas: actors, directors, genres, movie_directors, movies y roles. A continuación, podemos escribir la siguiente consulta para obtener un resumen de cada actor, ordenado por el mayor número de apariciones en películas.
No tarda mucho en devolver un resultado, pero supongamos que queremos que sea aún más rápido y menos costoso en términos computacionales. Supongamos que este conjunto de datos también recibe actualizaciones constantes: se estrenan películas continuamente y también aparecen nuevos actores y directores. Ha llegado el momento de usar una vista materializada actualizable, así que primero creemos una tabla de destino para los resultados:
Y ahora podemos definir la vista:
La vista se ejecutará de inmediato y, a partir de entonces, cada minuto según la configuración, para garantizar que se reflejen las actualizaciones de la tabla de origen. ¡Nuestra consulta anterior para obtener un resumen de los actores pasa a ser sintácticamente más simple y considerablemente más rápida!
Supongamos que añadimos a nuestros datos de origen a un nuevo actor, “Clicky McClickHouse”, ¡que resulta haber aparecido en muchísimas películas!
En menos de 60 segundos, nuestra tabla de destino se actualiza para reflejar la prolífica carrera interpretativa de Clicky:
Última modificación el 1 de julio de 2026