Skip to main content
Este tutorial te muestra cómo mantener rollups preagregados a partir de una tabla de eventos de alto volumen mediante vistas materializadas. Crearás tres objetos: una tabla sin procesar, una tabla de rollup y la vista materializada que escribe automáticamente en la tabla de rollup.

Cuándo usar este patrón

Usa este patrón cuando:
  • Tienes un flujo de eventos de solo inserción (clics, vistas de página, IoT, logs).
  • La mayoría de las consultas son agregaciones sobre intervalos de tiempo (por minuto/hora/día).
  • Quieres lecturas consistentes en menos de un segundo sin volver a escanear todas las filas sin procesar.
1

Crear la tabla de eventos sin procesar

Notas
  • PARTITION BY toYYYYMM(event_time) mantiene las particiones pequeñas y fáciles de eliminar.
  • ORDER BY (event_time, user_id) admite consultas acotadas en el tiempo + filtro secundario.
  • LowCardinality(String) ahorra memoria para dimensiones categóricas.
  • TTL elimina los datos brutos después de 90 días (ajústalo según tus requisitos de retención).
2

Diseña la tabla de rollup (agregada)

Preagregaremos con granularidad horaria. Elige la granularidad para ajustarla al intervalo de análisis más habitual.
Almacenamos estados de agregación (p. ej., AggregateFunction(sum, ...)) que representan de forma compacta agregados parciales y que pueden fusionarse o finalizarse más adelante.
3

Cree una vista materializada que rellene el rollup

Esta vista materializada se ejecuta automáticamente con las inserciones en events_raw y escribe estados de agregación en el rollup.
4

Insertar algunos datos de ejemplo

Inserta algunos datos de ejemplo:
5

Consultar el rollup

Puedes combinar los estados en tiempo de lectura o finalizarlos:

Si esperas que las lecturas siempre se hagan contra el rollup, puedes crear una segunda vista materializada que escriba valores finalizados en una tabla MergeTree «normal» con la misma granularidad de 1 h. Los estados ofrecen más flexibilidad, mientras que los valores finalizados permiten lecturas ligeramente más simples.
6

Filtra por campos de la clave primaria para obtener el máximo rendimiento

Puedes usar el comando EXPLAIN para ver cómo el índice descarta datos:
Query
Response
El plan de ejecución de la consulta anterior muestra que se usan tres tipos de índices: un índice MinMax, un índice de partición y un índice de clave primaria. Cada índice utiliza campos especificados en nuestra clave primaria: (bucket_start, country, event_type). Para obtener el mejor rendimiento de filtrado, asegúrate de que tus consultas utilicen campos de la clave primaria para omitir datos.
7

Variantes habituales

  • Granularidades diferentes: añada un rollup diario:
A continuación, una segunda vista materializada:
  • Compresión: aplica codecs a las columnas grandes (ejemplo: Codec(ZSTD(3))) en la tabla raw.
  • Control de costos: concentra la retención más exigente en la tabla raw y conserva los roll-ups a largo plazo.
  • Carga de datos históricos: al cargar datos históricos, inserta en events_raw y deja que la vista materializada genere los roll-ups automáticamente. Para las filas existentes, usa POPULATE al crear la vista materializada, si es adecuado, o INSERT SELECT.
8

Limpieza y retención

  • Aumente el TTL de los datos sin procesar (p. ej., 30/90 días), pero mantenga las agregaciones durante más tiempo (p. ej., 1 año).
  • También puede usar TTL para mover partes antiguas a un almacenamiento más económico si está habilitado el almacenamiento por niveles.
9

Solución de problemas

  • ¿La vista materializada no se actualiza? Compruebe que las inserciones vayan a events_raw (no a la tabla de rollup) y que el destino de la vista materializada sea correcto (TO events_rollup_1h).
  • ¿Consultas lentas? Confirme que apunten al rollup (consulte directamente la tabla de rollup) y que los filtros de tiempo se ajusten a la granularidad del rollup.
  • ¿Desajustes en el backfill? Use SYSTEM FLUSH LOGS y compruebe system.query_log / system.parts para confirmar las inserciones y las fusiones.
Última modificación el 23 de julio de 2026