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
- 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
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.TTLelimina 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.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 enevents_raw y escribe estados de agregación en el rollup.4
5
Consultar el rollup
Puedes combinar los estados en tiempo de lectura o finalizarlos:- Combinar en tiempo de lectura
- Finalizar con -Final
6
Filtra por campos de la clave primaria para obtener el máximo rendimiento
Puedes usar el comandoEXPLAIN para ver cómo el índice descarta datos:Query
Response
(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:
- 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_rawy deja que la vista materializada genere los roll-ups automáticamente. Para las filas existentes, usaPOPULATEal crear la vista materializada, si es adecuado, oINSERT 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 LOGSy compruebesystem.query_log/system.partspara confirmar las inserciones y las fusiones.