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.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:
- 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 comando 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:
EXPLAIN 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.