Saltar al contenido principal
Este ejemplo muestra cómo crear una vista materializada y, después, cómo encadenar una segunda vista materializada sobre la primera. En esta página verá cómo hacerlo, algunas de las posibilidades y sus limitaciones. Se pueden resolver distintos casos de uso creando una vista materializada que tome como origen otra vista materializada.

Ejemplo: Usaremos un conjunto de datos ficticio con el número de visitas por hora para un grupo de nombres de dominio. Nuestro objetivo
  1. Necesitamos los datos agregados por mes para cada nombre de dominio,
  2. También necesitamos los datos agregados por año para cada nombre de dominio.
Puede elegir una de estas opciones:
  • Escribir consultas que lean y agreguen los datos durante la consulta SELECT
  • Preparar los datos durante la ingesta en un nuevo formato
  • Preparar los datos durante la ingesta para una agregación específica.
Preparar los datos mediante vistas materializadas le permitirá reducir la cantidad de datos y cálculos que ClickHouse necesita realizar, haciendo que sus consultas SELECT sean más rápidas.

Tabla de origen para las vistas materializadas

Cree la tabla de origen; como nuestro objetivo es generar informes sobre los datos agregados y no sobre las filas individuales, podemos procesarlos, pasar la información a las vistas materializadas y descartar los datos reales entrantes. Esto cumple nuestro objetivo y ahorra almacenamiento, por lo que usaremos el motor de tabla Null.
Puedes crear una vista materializada sobre una tabla Null. Así, los datos escritos en la tabla se reflejarán en la vista, pero los datos originales en bruto seguirán descartándose.

Tabla agregada mensual y vista materializada

Para la primera vista materializada, necesitamos crear la tabla Target; en este ejemplo, será analytics.monthly_aggregated_data y almacenará la suma de las vistas por mes y por nombre de dominio.
La vista materializada que enviará los datos a la tabla de destino tendrá este aspecto:

Tabla anual agregada y vista materializada

Ahora crearemos la segunda vista materializada, que estará vinculada a nuestra tabla de destino anterior, monthly_aggregated_data. Primero, crearemos una nueva tabla de destino que almacenará la suma de las visualizaciones agregadas por año para cada nombre de dominio.
Este paso define la cascada. La sentencia FROM usará la tabla monthly_aggregated_data, lo que significa que el flujo de datos será el siguiente:
  1. Los datos llegan a la tabla hourly_data.
  2. ClickHouse reenviará los datos recibidos a la tabla de la primera vista materializada, monthly_aggregated_data,
  3. Por último, los datos recibidos en el paso 2 se reenviarán a year_aggregated_data.
Un malentendido común al trabajar con vistas materializadas es pensar que los datos se leen de la tabla. No es así como funcionan las vistas materializadas; los datos que se propagan son el bloque insertado, no el resultado final de la tabla.Imaginemos, en este ejemplo, que el motor usado en monthly_aggregated_data es CollapsingMergeTree; los datos que se reenvían a nuestra segunda vista materializada, year_aggregated_data_mv, no serán el resultado final de la tabla colapsada, sino el bloque de datos con los campos definidos como en SELECT ... GROUP BY.Si usas CollapsingMergeTree, ReplacingMergeTree o incluso SummingMergeTree y planeas crear una vista materializada en cascada, debes comprender las limitaciones que se describen aquí.

Datos de ejemplo

Ha llegado el momento de poner a prueba nuestra vista materializada en cascada insertando algunos datos:
Si haces un SELECT del contenido de analytics.hourly_data, verás lo siguiente, porque el motor de tabla es Null, pero los datos se procesaron.
Hemos utilizado un conjunto de datos pequeño para asegurarnos de que podemos seguir y comparar el resultado con lo que esperamos; una vez que el flujo funcione correctamente con un conjunto de datos pequeño, podrás pasar a un volumen mayor de datos.

Resultados

Si intentas consultar la tabla de destino seleccionando el campo sumCountViews, verás la representación binaria (en algunos terminales), ya que el valor no se almacena como un número, sino como un tipo AggregateFunction. Para obtener el resultado final de la agregación, debes usar el sufijo -Merge. Puedes ver los caracteres especiales almacenados en AggregateFunction con esta consulta:
En su lugar, probemos a usar el sufijo Merge para obtener el valor sumCountViews:
En AggregatingMergeTree hemos definido AggregateFunction como sum, por lo que podemos usar sumMerge. Si usamos la función avg en AggregateFunction, utilizaremos avgMerge, y así sucesivamente.
Ahora podemos comprobar que las vistas materializadas cumplen el objetivo que nos hemos propuesto. Ahora que tenemos los datos almacenados en la tabla de destino monthly_aggregated_data, podemos obtener los datos agregados por mes para cada nombre de dominio:
Datos agregados por año para cada nombre de dominio:

Combinar varias tablas de origen en una sola tabla de destino

Las vistas materializadas también pueden utilizarse para combinar varias tablas de origen en una misma tabla de destino. Esto resulta útil para crear una vista materializada similar a la lógica de UNION ALL. Primero, cree dos tablas de origen que representen distintos conjuntos de métricas:
Luego, cree la tabla Target con el conjunto combinado de métricas:
Cree dos vistas materializadas que apunten a la misma tabla Target. No es necesario incluir explícitamente las columnas que faltan:
Ahora, al insertar valores, estos se agregarán a las columnas correspondientes de la tabla Target:
Las impresiones y los clics combinados en la tabla Target:
Esta consulta debería devolver algo como:
Última modificación el 1 de julio de 2026