Introducción
Las alertas también pueden beneficiarse de las vistas materializadas y las aprovecharán automáticamente.
Esto puede reducir la sobrecarga computacional de ejecutar muchas alertas, especialmente porque suelen ejecutarse con mucha frecuencia.
Reducir el tiempo de ejecución puede ser beneficioso tanto para la capacidad de respuesta como para el consumo de recursos.
Qué son las vistas materializadas incrementales
SELECT significativamente más rápidas.
A diferencia de las bases de datos transaccionales como Postgres, una vista materializada en ClickHouse no es una instantánea almacenada. En cambio, actúa como un disparador que ejecuta una consulta sobre bloques de datos a medida que se insertan en una tabla de origen. El resultado de esta consulta se escribe en una tabla de destino independiente. A medida que se insertan más datos, se anexan nuevos resultados parciales y se fusionan en la tabla de destino. El resultado fusionado equivale a ejecutar la agregación sobre el conjunto de datos original completo.
La principal razón para usar vistas materializadas es que los datos escritos en la tabla de destino representan el resultado de una agregación, un filtrado o una transformación. En ClickStack, se usan exclusivamente para agregaciones. Estos resultados suelen ser mucho más pequeños que los datos de entrada sin procesar y, a menudo, representan estados de agregación parciales. Sumado a la simplicidad de consultar la tabla de destino preagregada, esto da lugar a una latencia de consulta considerablemente menor en comparación con realizar el mismo cómputo sobre datos sin procesar en tiempo de consulta.
Las vistas materializadas en ClickHouse se actualizan continuamente a medida que los datos fluyen hacia la tabla de origen, comportándose más como índices siempre actualizados. Esto difiere de muchas otras bases de datos, donde las vistas materializadas son instantáneas estáticas que deben actualizarse periódicamente, de forma similar a las vistas materializadas actualizables de ClickHouse.
Las vistas materializadas incrementales calculan solo los cambios en la vista a medida que llegan nuevos datos, desplazando el cómputo al tiempo de inserción. Como ClickHouse está altamente optimizado para la ingestión, el costo incremental de mantener la vista para cada bloque insertado es pequeño en relación con el ahorro obtenido durante la ejecución de las consultas. El costo de calcular la agregación se amortiza entre las inserciones, en lugar de pagarse repetidamente en cada lectura. Por lo tanto, consultar los resultados preagregados es mucho menos costoso que volver a calcularlos, lo que se traduce en un menor costo operativo y un rendimiento casi en tiempo real para las visualizaciones posteriores, incluso a escala de petabytes.
Este modelo difiere fundamentalmente de los sistemas que recomputan vistas completas en cada actualización o dependen de actualizaciones programadas. Para obtener una explicación más detallada de cómo funcionan las vistas materializadas y cómo crearlas, consulta la guía enlazada arriba.
Cada vista materializada introduce una sobrecarga adicional en el tiempo de inserción, por lo que deben usarse de forma selectiva.
Una sola vista materializada puede calcular múltiples métricas para distintas agrupaciones, por ejemplo, duración mínima, máxima y p95 por nombre de servicio en intervalos de un minuto. Esto permite que una sola vista sirva para muchas visualizaciones, en lugar de solo una. Por lo tanto, consolidar métricas en vistas compartidas es importante para maximizar el valor de cada vista y garantizar su reutilización en dashboards y flujos de trabajo.
Selección de visualizaciones para acelerar
Identificar visualizaciones de alto impacto
- Visualizaciones de dashboard que se actualizan con frecuencia y se muestran de forma continua, como dashboards de monitoring de alto nivel en pantallas murales.
- Flujos de diagnóstico utilizados en runbooks, en los que se consultan repetidamente gráficos concretos durante la respuesta a incidentes y se necesita que devuelvan resultados con rapidez.
- Experiencias clave de HyperDX, entre ellas:
- Vistas de histograma en la página de Búsqueda.
- Visualizaciones utilizadas en dashboards predefinidos, como las vistas de APM, Services o Kubernetes.
Equilibra el beneficio con el coste de inserción
Antes de pasar a producción, valida siempre la sobrecarga de recursos que introducen las vistas materializadas, en particular el uso de CPU, la E/S de disco y la actividad de merge. Cada vista materializada incrementa el trabajo en el momento de la inserción y añade partes adicionales, por lo que es importante asegurarse de que los merges pueden seguir el ritmo y de que el número de partes se mantiene estable. Esto puede supervisarse mediante tablas del sistema y el panel de observabilidad integrado en ClickHouse de código abierto, o mediante las métricas integradas y los paneles de monitorización en ClickHouse Cloud. Consulta Too many parts para obtener orientación sobre cómo diagnosticar y mitigar un número excesivo de partes.
toStartOfMinute. Sin embargo, muchas visualizaciones también comparten claves de agrupación adicionales, como el nombre del servicio, el nombre del span o el código de estado. Cuando varias visualizaciones usan las mismas dimensiones de agrupación, a menudo pueden resolverse con una sola vista materializada.
Por ejemplo (para traces):
- Duración media por nombre de servicio a lo largo del tiempo -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - Recuento de solicitudes por nombre de servicio a lo largo del tiempo -
SELECT count() count, toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - Duración media por código de estado a lo largo del tiempo -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time - Recuento de solicitudes por código de estado a lo largo del tiempo -
SELECT count() count, toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time
Creación de una vista materializada
En los casos en que no haya un panel de depuración disponible dentro de HyperDX para un componente, los usuarios pueden inspeccionar la consola del navegador, donde se registran todas las consultas.
AggregatingMergeTree:
A continuación puedes ver un ejemplo de cómo usar AggregatingMergeTree y las funciones de agregación:
Ejemplo de vista materializada
otel_traces_1m para almacenar los estados de agregación correspondientes:
otel_traces_1m_mv - calcula y escribe estos estados a medida que se van insertando nuevos datos:
- La tabla de destino, que define el esquema y los tipos de estado de agregación utilizados para almacenar resultados intermedios. El motor AggregatingMergeTree es necesario para garantizar que estos estados se combinen correctamente en segundo plano.
- La consulta de la vista materializada se ejecuta automáticamente durante la inserción. En comparación con la consulta original, utiliza funciones de estado como
avgStateyquantilesStateen lugar de funciones de agregación final.
Uso de las vistas materializadas en ClickStack
Registrar una vista materializada para su uso
Editar la fuente
Vaya a la fuente correspondiente en HyperDX y abra el cuadro de diálogo Edit configuration. Desplácese hasta la sección de vistas materializadas.Agregar la vista materializada
Seleccione Add materialized view y, a continuación, elija la base de datos y la tabla de destino que sustentan la vista materializada.Seleccionar métricas
En la mayoría de los casos, las columnas de timestamp, dimensión y métrica se inferirán automáticamente. Si no es así, especifíquelas manualmente.Para las métricas, debe mapear:- El nombre de la columna original, por ejemplo,
Duration, con - La columna agregada correspondiente en la vista materializada, por ejemplo
avg__Duration
Seleccionar la granularidad temporal
Seleccione la granularidad temporal de la vista materializada, por ejemplo, un minuto.Seleccionar la fecha mínima
Especifique la fecha mínima para la que la vista materializada contiene datos. Esto representa el timestamp más antiguo disponible en la vista y, por lo general, es el momento en que se creó, suponiendo que la ingestión haya sido continua.Las vistas materializadas no se rellenan automáticamente con datos históricos cuando se crean, por lo que solo contendrán filas generadas a partir de datos insertados después de su creación.
Puede encontrar una guía completa sobre la carga de datos históricos en vistas materializadas en “Carga de datos históricos.”
Guardar la fuente
Guarde la configuración de la fuente.Verificar la aceleración en dashboards y visualizaciones
ClickStack solo usará una vista materializada si su timestamp mínimo es menor o igual que el inicio del intervalo temporal de la consulta, lo que garantiza que la vista contenga todos los datos necesarios. Aunque las consultas se dividen internamente en subconsultas basadas en tiempo, las vistas materializadas se aplican a toda la consulta o no se aplican en absoluto. En el futuro, podrían incorporarse mejoras para permitir usar vistas de forma selectiva en las subconsultas compatibles.
- Compruebe el estado de la optimización Al ver un dashboard o una visualización, busque el rayo o el icono
Accelerated:
- Rayo verde: indica que la consulta está acelerada mediante una vista materializada.
- Rayo naranja: indica que la consulta se ejecuta sobre la tabla de origen.
- Inspeccione los detalles de la optimización Haga clic en el icono del rayo para abrir un panel de detalles que muestra:
- Vista materializada activa: la vista seleccionada para la consulta, incluido el número estimado de filas.
- Vistas materializadas omitidas: vistas compatibles que no se seleccionaron, junto con sus tamaños de exploración estimados.
- Vistas materializadas incompatibles: vistas que no pudieron usarse y el motivo específico.
- Comprenda los motivos habituales de incompatibilidad Es posible que no se use una vista materializada si:
- El intervalo temporal de la consulta comienza antes del timestamp mínimo de la vista.
- La granularidad de la visualización no es un múltiplo de la granularidad de la vista.
- La función de agregación solicitada por la consulta no está presente en la vista.
- La consulta usa expresiones count personalizadas, como
count(if(...)), que no pueden derivarse de los estados de agregación de la vista.
Cómo se seleccionan las vistas materializadas para las visualizaciones
EXPLAIN ESTIMATE de ClickHouse.
El proceso de selección sigue una secuencia bien definida:
-
Validar la compatibilidad
ClickStack primero determina si una vista materializada puede usarse para la consulta comprobando lo siguiente:
- Cobertura temporal: el intervalo de tiempo de la consulta debe quedar completamente dentro del rango de datos disponible de la vista materializada.
- Granularidad: el intervalo temporal de la visualización debe ser igual o más amplio que la granularidad de la vista.
- Agregaciones: las métricas solicitadas deben estar presentes en la vista y poder calcularse a partir de sus estados de agregación.
-
Transformar la consulta
Para las vistas compatibles, ClickStack reescribe la consulta para que apunte a la tabla de la vista materializada:
- Las funciones de agregación se asignan a las correspondientes columnas materializadas.
- Los combinadores
-Mergese aplican a los estados de agregación. - La agrupación temporal se ajusta para alinearse con la granularidad de la vista.
-
Seleccionar el mejor candidato
Si hay varias vistas materializadas compatibles disponibles, ClickStack ejecuta una consulta
EXPLAIN ESTIMATEpara cada candidata y compara el número estimado de filas y gránulos analizados. Se selecciona la vista con el menor coste estimado de análisis. - Reversión automática Si ninguna vista materializada es compatible, ClickStack vuelve automáticamente a consultar la tabla de origen.
Ejemplo de selección de vistas materializadas
otel_traces_1m, agrupada por minuto,ServiceNameyStatusCodeotel_traces_1m_v2, agrupada por minuto,ServiceName,StatusCodeySpanName
EXPLAIN ESTIMATE para cada candidata y compara los recuentos estimados de gránulos; es decir:
otel_traces_1m es más pequeña y escanea menos gránulos, se selecciona automáticamente.
Ambas vistas materializadas siguen ofreciendo mejor rendimiento que consultar directamente la tabla base, pero elegir la vista más pequeña que sea suficiente proporciona el mejor rendimiento.
Alertas
Carga de datos históricos en una vista materializada
Enfoques para la carga de datos históricos
Evite POPULATENo se recomienda usar el comando POPULATE para la carga de datos históricos de vistas materializadas, salvo en conjuntos de datos pequeños donde la ingesta esté pausada. Este operador puede omitir filas insertadas en su tabla de origen, ya que la vista materializada se crea después de que finaliza el hash de populate. Además, este populate se ejecuta sobre todos los datos y es vulnerable a interrupciones o a límites de memoria en conjuntos de datos grandes.
Relleno histórico directo mediante INSERT INTO SELECT
Determinar la cobertura actual de la vista
Antes de intentar cualquier relleno histórico, determine primero qué datos contiene ya la vista materializada. Esto se hace consultando la marca de tiempo mínima presente en la tabla de destino:Decidir si es necesario el relleno histórico
En la mayoría de las implementaciones de ClickStack, las consultas se centran en datos recientes, como las últimas 24 horas. En estos casos, las vistas recién creadas pasan a ser totalmente utilizables poco después de su creación, y el relleno histórico no es necesario.Si la marca de tiempo devuelta en el paso anterior es lo bastante antigua para sus casos de uso, no es necesario realizar ningún relleno histórico. El relleno histórico solo debe considerarse cuando:- Las consultas abarcan con frecuencia rangos históricos amplios.
- La vista es crítica para el rendimiento en esos rangos.
- El tamaño del conjunto de datos y el coste de la agregación hacen viable el relleno histórico.
Rellenar los datos históricos faltantes
Si se requiere relleno histórico, complete la tabla de destino de la vista materializada para las marcas de tiempo anteriores al mínimo actual usando la consulta de la vista, modificada para leer únicamente datos anteriores a la marca de tiempo registrada arriba. Como la tabla de destino usa AggregatingMergeTree, la consulta de relleno histórico debe insertar estados de agregación, no valores finales.Observe cómo la siguiente consulta añade una cláusulaWHERE para limitar la agregación a datos anteriores a la marca de tiempo más temprana presente en la vista:Relleno histórico incremental con una tabla Null
INSERT INTO SELECT puede resultar poco práctico o inseguro. En estos casos, se recomienda un enfoque de relleno histórico incremental. Este método se asemeja más a cómo funcionan normalmente las vistas materializadas incrementales, ya que procesa los datos en bloques manejables en lugar de agregar de una sola vez todo el conjunto de datos histórico.
Este enfoque es adecuado cuando:
- De otro modo, la consulta de relleno histórico tardaría muchas horas en ejecutarse.
- El uso máximo de memoria de una agregación completa es demasiado alto.
- Quiere controlar estrictamente el consumo de CPU y memoria durante el relleno histórico.
- Necesita un proceso más resiliente que pueda reiniciarse de forma segura si se interrumpe.
Crear una tabla Null para el relleno histórico
Cree una tabla Null ligera que contenga solo las columnas necesarias para la agregación de la vista materializada. Esto minimiza el uso de E/S y memoria.Asociar una vista materializada a la tabla Null
A continuación, cree una vista materializada sobre la tabla Null que apunte a la misma tabla de agregación que usa su vista materializada principal.Hacer relleno histórico de los datos de forma incremental
Por último, inserte los datos históricos en la tabla Null. La vista materializada procesará los datos bloque por bloque, emitiendo estados de agregación en la tabla de destino sin persistir las filas originales.Para mayor seguridad, considere dirigir la vista materializada de relleno histórico a una tabla de destino temporal (por ejemplo,
otel_traces_1m_v2). Una vez que el relleno histórico se complete correctamente, las particiones pueden moverse a la tabla de destino principal; por ejemplo, ALTER TABLE otel_traces_1m_v2 MOVE PARTITION '2026-01-02' TO otel_traces_1m. Esto permite una recuperación sencilla si el relleno histórico se interrumpe o falla debido a límites de recursos.Recomendaciones
Selección y alineación de la granularidad
- Gráficos de tiempo (gráficos de líneas o de barras con el tiempo en el eje x): La granularidad explícita del gráfico debe ser un múltiplo de la granularidad de la vista materializada. Por ejemplo, un gráfico de 10 minutos puede usar vistas materializadas con granularidad de 10, 5, 2 o 1 minuto, pero no vistas de 20 minutos ni de 3 minutos.
-
Gráficos no temporales (gráficos de número, tabla o resumen):
La granularidad efectiva se calcula como
(intervalo de tiempo / 80), redondeada hacia arriba hasta la granularidad compatible con HyperDX más cercana. Esta granularidad calculada también debe ser un múltiplo de la granularidad de la vista materializada.
- No cree vistas materializadas con una granularidad de 10 minutos. ClickStack admite una granularidad de 15 minutos para gráficos y alertas, pero no de 10 minutos. Por lo tanto, una vista materializada de 10 minutos sería incompatible con visualizaciones y alertas habituales de 15 minutos.
- Prefiera granularidades de 1 minuto o 1 hora, ya que encajan bien con la mayoría de las configuraciones de gráficos y alertas.
Limite y consolide las vistas materializadas
- No más de 20 vistas materializadas por fuente.
- Alrededor de 10 vistas materializadas suele ser lo óptimo.
- Consolide varias visualizaciones en una sola vista cuando compartan dimensiones comunes.
Elige bien las dimensiones
- Cada columna de agrupación adicional aumenta el tamaño de la vista.
- Equilibra la flexibilidad de las consultas con el coste de almacenamiento y de inserción.
- Los filtros sobre columnas que no estén presentes en la vista harán que ClickStack recurra a la tabla de origen.
ConsejoUna referencia básica, útil en casi todos los casos, es una vista materializada agrupada por nombre del servicio y una métrica de recuento, lo que permite histogramas rápidos y vistas generales por servicio en Búsqueda y en los paneles.
Convenciones de nomenclatura para columnas de agregación
- Patrón:
<aggFn>__<sourceColumn> - Ejemplos:
avg__Durationmax__Durationcount__para el recuento de filas
Cuantiles y elección del sketch
quantilesproduce sketches más grandes en disco, pero su cálculo en el momento de la inserción es menos costoso.quantileTDigestes más costosa de calcular en el momento de la inserción, pero produce sketches más pequeños, lo que a menudo se traduce en consultas sobre vistas más rápidas.
quantile(0.5)) en el momento de la inserción para ambas funciones. El sketch resultante se puede seguir consultando más adelante para otros valores de cuantiles, p. ej., quantile(0.95). Se recomienda experimentar para encontrar el mejor equilibrio para tu carga de trabajo.
Validar continuamente la eficacia
- Confirme su uso mediante los indicadores de aceleración de la UI.
- Compare el rendimiento de las consultas antes y después de habilitar la vista.
- Supervise el uso de recursos y el comportamiento de las operaciones de fusión.
Configuraciones avanzadas
- Datos recientes de alta resolución con vistas históricas más agregadas
- Vistas a nivel de servicio para una visión general y vistas a nivel de endpoint para diagnósticos en profundidad
Limitaciones
Razones comunes de incompatibilidad
- Rango temporal de la consulta El inicio del rango temporal de la consulta es anterior a la marca de tiempo mínima de la vista materializada. Como las vistas no se rellenan automáticamente con datos históricos, solo pueden satisfacer consultas para rangos temporales que cubren por completo.
-
Incompatibilidad de granularidad
La granularidad efectiva de la visualización debe ser un múltiplo exacto de la granularidad de la vista materializada. En concreto:
- En los gráficos temporales (gráficos de líneas o barras con el tiempo en el eje x), la granularidad seleccionada del gráfico debe ser un múltiplo de la granularidad de la vista. Por ejemplo, un gráfico de 10 minutos puede usar vistas materializadas de 10, 5, 2 o 1 minuto, pero no vistas de 20 minutos ni de 3 minutos.
- En los gráficos no temporales (gráficos de número o de tabla), la granularidad efectiva se calcula como
(time range / 80), redondeada hacia arriba a la granularidad admitida por HyperDX más cercana, y también debe ser un múltiplo de la granularidad de la vista.
- Funciones de agregación no compatibles La consulta solicita una agregación que no está presente en la vista materializada. Solo se pueden usar las agregaciones calculadas y almacenadas explícitamente en la vista.
-
Expresiones de recuento personalizadas
Las consultas que usan expresiones como
count(if(...))u otros recuentos condicionales no pueden derivarse de estados de agregación estándar y, por lo tanto, no pueden usar vistas materializadas.
Restricciones de diseño y operación
- Sin relleno histórico automático Las vistas materializadas incrementales solo contienen los datos insertados después de su creación. La aceleración histórica requiere un relleno histórico explícito, que puede resultar costoso o poco práctico para conjuntos de datos grandes.
- compensaciones de granularidad Las vistas con una granularidad muy fina aumentan el tamaño de almacenamiento y la sobrecarga en el momento de la inserción, mientras que las de granularidad gruesa reducen la flexibilidad. La granularidad debe elegirse con cuidado para ajustarse a los patrones de consulta previstos.
- explosión de dimensiones Añadir muchas dimensiones de agrupación aumenta significativamente el tamaño de la vista y puede reducir su eficacia. Las vistas deben incluir solo las columnas de agrupación y filtrado que se usan habitualmente.
- escalabilidad limitada del número de vistas Cada vista materializada añade sobrecarga en el momento de la inserción y contribuye a la presión sobre las fusiones. Crear demasiadas vistas puede afectar negativamente a la ingestión y a las fusiones en segundo plano.
Resolución de problemas
La vista materializada no se está usando
- Abra el modal de optimización para ver si aparece “Date range not supported.”
- Asegúrese de que el rango de fechas de la consulta sea posterior a la fecha mínima de la vista materializada.
- Elimine la fecha mínima si la vista materializada contiene todos los datos históricos.
- Verifique que la granularidad del gráfico sea un múltiplo de la granularidad de la MV.
- Intente configurar el gráfico en “Auto” o seleccione manualmente una granularidad compatible.
- Compruebe si el gráfico usa agregaciones incluidas en la MV.
- Revise “Available aggregated columns” en el modal de optimización.
- Asegúrese de que las columnas de GROUP BY estén en las columnas de dimensión de la MV.
- Compruebe “Available group/filter columns” en el modal de optimización.
Consultas lentas de vistas materializadas
- La MV tiene demasiadas filas debido a una granularidad baja (p. ej., 1 segundo).
- Solución: Crear una MV con una granularidad mayor (p. ej., 1 minuto o 1 hora).
- La MV tiene una cardinalidad alta debido a la gran cantidad de columnas de dimensión.
- Solución: Reducir las columnas de dimensión a las más usadas.
- El sistema ejecuta
EXPLAINen cada MV. - Solución: Eliminar las MV que rara vez se usan o que siempre se omiten.
Errores de configuración
- Añada al menos una columna agregada a la configuración de la MV.
- Especifique qué columna se debe usar para la agregación (solo count puede omitir la columna de origen).
- Use una de las granularidades predefinidas del menú desplegable.
- El formato debe ser un intervalo SQL válido (por ejemplo,
1 hour, no1 h).