Introdução
Os alertas também podem se beneficiar de visões materializadas e as utilizarão automaticamente.
Isso pode reduzir a sobrecarga computacional de executar muitos alertas, especialmente porque eles costumam ser executados com muita frequência.
Reduzir o tempo de execução pode ser benéfico tanto em termos de responsividade quanto de consumo de recursos.
O que são views materializadas incrementais
SELECT significativamente mais rápidas.
Ao contrário de bancos de dados transacionais como o Postgres, uma visão materializada no ClickHouse não é um snapshot armazenado. Em vez disso, ela funciona como um trigger que executa uma consulta sobre blocos de dados à medida que eles são inseridos em uma tabela de origem. A saída dessa consulta é gravada em uma tabela de destino separada. À medida que dados adicionais são inseridos, novos resultados parciais são anexados e mesclados à tabela de destino. O resultado mesclado equivale a executar a agregação sobre todo o conjunto de dados original.
A principal motivação para usar visões materializadas é que os dados gravados na tabela de destino representam o resultado de uma agregação, filtragem ou transformação. No ClickStack, elas são usadas exclusivamente para agregações. Esses resultados normalmente são muito menores do que os dados brutos de entrada, muitas vezes representando estados de agregação parciais. Somado à simplicidade de consultar a tabela de destino pré-agregada, isso resulta em latência de consulta substancialmente menor em comparação com executar a mesma computação sobre dados brutos no momento da consulta.
As visões materializadas no ClickHouse são atualizadas continuamente à medida que os dados fluem para a tabela de origem, comportando-se mais como índices sempre atualizados. Isso difere de muitos outros bancos de dados, nos quais visões materializadas são snapshots estáticos que precisam ser atualizados periodicamente, de forma semelhante às visões materializadas atualizáveis do ClickHouse.
Views materializadas incrementais computam apenas as alterações na visão à medida que novos dados chegam, transferindo a computação para o momento da inserção. Como o ClickHouse é altamente otimizado para ingestão, o custo incremental de manter a visão para cada bloco inserido é pequeno em relação à economia obtida durante a execução das consultas. O custo de computar a agregação é amortizado ao longo das inserções, em vez de ser pago repetidamente a cada leitura. Portanto, consultar os resultados pré-agregados é muito menos custoso do que recomputá-los, resultando em menor custo operacional e desempenho quase em tempo real para visualizações que consomem esses dados, mesmo em escala de petabytes.
Esse modelo difere fundamentalmente de sistemas que recompõem visões inteiras a cada atualização ou dependem de atualizações agendadas. Para uma explicação mais aprofundada de como visões materializadas funcionam e como criá-las, consulte o guia indicado acima.
Cada visão materializada introduz uma sobrecarga adicional no momento da inserção, portanto deve ser usada de forma seletiva.
Uma única visão materializada pode computar múltiplas métricas para diferentes agrupamentos, por exemplo, duração mínima, máxima e p95 por service name em buckets de um minuto. Isso permite que uma única visão atenda a muitas visualizações, e não apenas a uma. Portanto, consolidar métricas em visões compartilhadas é importante para maximizar o valor de cada visão e garantir que ela seja reutilizada entre dashboards e fluxos de trabalho.
Selecionando visualizações para aceleração
Identifique visualizações de alto impacto
- Visualizações de dashboard atualizadas com frequência e exibidas continuamente, como dashboards de monitoramento de alto nível mostrados em monitores de parede.
- Fluxos de diagnóstico usados em runbooks, nos quais gráficos específicos são consultados repetidamente durante a resposta a incidentes e precisam retornar resultados rapidamente.
- Experiências centrais do HyperDX, incluindo:
- Visualizações de histograma na página de busca.
- Visualizações usadas em dashboards predefinidos, como as visões de APM, Services ou Kubernetes.
Equilibre o benefício com o custo no momento da inserção
Antes de colocar em produção, sempre valide a sobrecarga de recursos introduzida por visões materializadas, especialmente o uso de CPU, E/S de disco e a atividade de mesclagem. Cada visão materializada aumenta o trabalho no momento da inserção e adiciona partes extras, por isso é importante garantir que as mesclagens consigam acompanhar e que a contagem de partes permaneça estável. Isso pode ser monitorado por meio das tabelas de sistema e do dashboard integrado de observabilidade no ClickHouse open-source, ou com as métricas integradas e os dashboards de monitoramento no ClickHouse Cloud. Consulte Too many parts para orientações sobre como diagnosticar e mitigar contagens excessivas de partes.
toStartOfMinute. No entanto, muitas visualizações também compartilham chaves de agrupamento adicionais, como nome do serviço, nome do span ou código de status. Quando várias visualizações usam as mesmas dimensões de agrupamento, muitas vezes elas podem ser atendidas por uma única visão materializada.
Por exemplo (para traces):
- Duração média por nome do serviço ao longo do tempo -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - Contagem de solicitações por nome do serviço ao longo do tempo -
SELECT count() count, toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - Duração média por código de status ao longo do tempo -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time - Contagem de solicitações por código de status ao longo do tempo -
SELECT count() count, toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time
Criando uma visão materializada
Nos casos em que um painel de depuração não estiver disponível no HyperDX para um componente, os usuários podem inspecionar o console do navegador, onde todas as consultas são registradas.
AggregatingMergeTree:
Você pode ver um exemplo de como usar o AggregatingMergeTree e funções de agregação no vídeo abaixo:
Exemplo de visão materializada
otel_traces_1m, que armazena os estados de agregação correspondentes:
otel_traces_1m_mv - então calcula e grava esses estados conforme novos dados são inseridos:
- A tabela de destino, que define o schema e os tipos de estado de agregação usados para armazenar resultados intermediários. O motor AggregatingMergeTree é necessário para garantir que esses estados sejam mesclados corretamente em segundo plano.
- A consulta da visão materializada é executada automaticamente durante o insert. Em comparação com a consulta original, ela usa funções de estado como
avgStateequantilesStateem vez de funções finais de agregação.
Usando visões materializadas no ClickStack
Registrando uma visão materializada para uso
Edite a fonte
Navegue até a fonte relevante no HyperDX e abra a caixa de diálogo Editar configuração. Role até a seção de visões materializadas.Adicione a visão materializada
Selecione Adicionar visão materializada e, em seguida, escolha o banco de dados e a tabela de destino que dão suporte à visão materializada.Selecione as métricas
Na maioria dos casos, as colunas de timestamp, dimensão e métrica serão inferidas automaticamente. Caso contrário, especifique-as manualmente.Para métricas, você deve mapear:- O nome original da coluna, por exemplo,
Duration, para - A coluna agregada correspondente na visão materializada, por exemplo,
avg__Duration
Selecione a granularidade de tempo
Selecione a granularidade de tempo da visão materializada, por exemplo, um minuto.Selecione a data mínima
Especifique a data mínima para a qual a visão materializada contém dados. Isso representa o timestamp mais antigo disponível na visão e, em geral, corresponde ao momento em que a visão foi criada, supondo que a ingestão tenha sido contínua.As visões materializadas não passam por backfill automaticamente quando são criadas, portanto conterão apenas linhas geradas a partir de dados inseridos após a criação.
Um guia completo sobre backfilling de visões materializadas pode ser encontrado em “Carga retroativa de dados.”
Salve a fonte
Salve a configuração da fonte.Verificando a aceleração em dashboards e visualizações
O ClickStack só usará uma visão materializada se o timestamp mínimo dela for menor ou igual ao início do intervalo de tempo da consulta, garantindo que a visão materializada contenha todos os dados necessários. Embora as consultas sejam divididas internamente em subconsultas com base em tempo, as visões materializadas são aplicadas à consulta inteira ou não são aplicadas. Melhorias futuras podem permitir o uso seletivo de visões materializadas em subconsultas elegíveis.
- Verifique o status da otimização Ao visualizar um dashboard ou uma visualização, procure o ícone de raio ou
Accelerated:
- Raio verde indica que a consulta está sendo acelerada por uma visão materializada.
- Raio laranja indica que a consulta é executada na tabela de origem.
- Inspecione os detalhes da otimização Clique no ícone de raio para abrir um painel de detalhes mostrando:
- Visão materializada ativa: a visão materializada selecionada para a consulta, incluindo sua contagem estimada de linhas.
- Visões materializadas ignoradas: visões materializadas compatíveis que não foram selecionadas, junto com seus tamanhos de varredura estimados.
- Visões materializadas incompatíveis: visões materializadas que não puderam ser usadas e o motivo específico.
- Entenda os motivos comuns de incompatibilidade Uma visão materializada pode não ser usada se:
- O intervalo de tempo da consulta começar antes do timestamp mínimo da visão materializada.
- A granularidade da visualização não for um múltiplo da granularidade da visão materializada.
- A função de agregação solicitada pela consulta não estiver presente na visão materializada.
- A consulta usar expressões de contagem personalizadas, como
count(if(...)), que não podem ser derivadas dos estados de agregação da visão materializada.
Como as visões materializadas são selecionadas para visualizações
EXPLAIN ESTIMATE do ClickHouse.
O processo de seleção segue uma sequência bem definida:
-
Validar a compatibilidade
O ClickStack primeiro determina se uma visão materializada é elegível para a consulta verificando:
- Cobertura de tempo: o intervalo de tempo da consulta deve estar totalmente contido no intervalo de dados disponível da visão materializada.
- Granularidade: o bucket de tempo da visualização deve ser igual ou menos detalhado que a granularidade da visão.
- Agregações: as métricas solicitadas devem estar presentes na visão e ser computáveis a partir de seus estados de agregação.
-
Transformar a consulta
Para visões compatíveis, o ClickStack reescreve a consulta para apontar para a tabela da visão materializada:
- As funções de agregação são mapeadas para as colunas materializadas correspondentes.
- Os combinadores
-Mergesão aplicados aos estados de agregação. - O agrupamento temporal em buckets é ajustado para se alinhar à granularidade da visão.
-
Selecionar o melhor candidato
Se várias visões materializadas compatíveis estiverem disponíveis, o ClickStack executa uma consulta
EXPLAIN ESTIMATEpara cada candidato e compara o número estimado de linhas e grânulos lidos. A visão com o menor custo estimado de leitura é selecionada. - Fallback transparente Se nenhuma visão materializada for compatível, o ClickStack volta automaticamente a consultar a tabela de origem.
Exemplo de como escolher visões materializadas
otel_traces_1m, agrupada por minuto,ServiceNameeStatusCodeotel_traces_1m_v2, agrupada por minuto,ServiceName,StatusCodeeSpanName
EXPLAIN ESTIMATE para cada candidato e compara a contagem estimada de grânulos, ou seja:
otel_traces_1m é menor e examina menos grânulos, ela é selecionada automaticamente.
Ambas as visões materializadas ainda têm desempenho superior ao de consultar a tabela base diretamente, mas selecionar a menor visão suficiente proporciona o melhor desempenho.
Alertas
Preenchimento retroativo de uma visão materializada
Abordagens de preenchimento retroativo
Evite o POPULATENão é recomendável usar o comando POPULATE para fazer o preenchimento retroativo de visões materializadas, exceto em conjuntos de dados pequenos nos quais a ingestão esteja pausada. Esse operador pode deixar passar linhas inseridas na tabela de origem, já que a visão materializada é criada depois que o hash de populate é concluído. Além disso, esse populate é executado sobre todos os dados e fica sujeito a interrupções ou a limites de memória em conjuntos de dados grandes.
Backfill direto usando INSERT INTO SELECT
Determine a cobertura atual da VIEW
Antes de tentar qualquer backfill, primeiro determine quais dados a VIEW materializada já contém. Isso é feito consultando o timestamp mínimo presente na tabela de destino:Decida se o backfill é necessário
Na maioria das implantações do ClickStack, as consultas se concentram em dados recentes, como as últimas 24 horas. Nesses casos, VIEWs recém-criadas se tornam totalmente utilizáveis pouco depois da criação, e o backfill é desnecessário.Se o timestamp retornado na etapa anterior for antigo o suficiente para os seus casos de uso, nenhum backfill será necessário. O backfill só deve ser considerado quando:- As consultas frequentemente abrangem longos intervalos históricos.
- A VIEW é crítica para o desempenho nesses intervalos.
- O tamanho do conjunto de dados e o custo da agregação tornam o backfill viável.
Faça o backfill dos dados históricos ausentes
Se o backfill for necessário, preencha a tabela de destino da VIEW materializada para timestamps anteriores ao mínimo atual usando a consulta da VIEW, modificada para ler apenas dados mais antigos do que o timestamp registrado acima. Como a tabela de destino usa AggregatingMergeTree, a consulta de backfill deve inserir estados de agregação, não valores finais.Observe como a consulta a seguir adiciona uma cláusulaWHERE para limitar a agregação a dados mais antigos do que o timestamp mais antigo presente na VIEW:Backfill incremental usando uma tabela Null
INSERT INTO SELECT pode ser impraticável ou inseguro. Nesses casos, recomenda-se uma abordagem de backfill incremental. Esse método reflete mais de perto como as visões materializadas incrementais normalmente funcionam, processando os dados em blocos gerenciáveis em vez de agregar todo o dataset histórico de uma vez.
Essa abordagem é apropriada quando:
- A consulta de backfill levaria muitas horas para ser executada.
- O pico de uso de memória de uma agregação completa é alto demais.
- Você quer controlar com precisão o consumo de CPU e memória durante o backfill.
- Você precisa de um processo mais resiliente, que possa ser reiniciado com segurança em caso de interrupção.
Criar uma tabela Null para backfill
Crie uma tabela Null leve que contenha apenas as colunas necessárias para a agregação da visão materializada. Isso minimiza a E/S e o uso de memória.Vincular uma visão materializada à tabela Null
Em seguida, crie uma visão materializada sobre a tabela Null que tenha como destino a mesma tabela de agregação usada pela sua visão materializada primária.Fazer o backfill dos dados incrementalmente
Por fim, insira os dados históricos na tabela Null. A visão materializada processará os dados bloco por bloco, emitindo estados de agregação na tabela de destino sem persistir as linhas brutas.Para maior segurança, considere direcionar a visão materializada de backfill para uma tabela de destino temporária (por exemplo,
otel_traces_1m_v2). Quando o backfill for concluído com sucesso, as partições podem ser movidas para a tabela de destino primária, por exemplo, ALTER TABLE otel_traces_1m_v2 MOVE PARTITION '2026-01-02' TO otel_traces_1m. Isso facilita a recuperação caso o backfill seja interrompido ou falhe devido a limites de recursos.Recomendações
Seleção e alinhamento da granularidade
- Gráficos de tempo (gráficos de linha ou de barras com tempo no eixo x): A granularidade explícita do gráfico precisa ser um múltiplo da granularidade da VIEW materializada. Por exemplo, um gráfico de 10 minutos pode usar VIEWs materializadas com granularidade de 10, 5, 2 ou 1 minuto, mas não VIEWs de 20 minutos nem de 3 minutos.
-
Gráficos sem eixo temporal (gráficos de número, tabela ou resumo):
A granularidade efetiva é calculada como
(intervalo de tempo / 80), arredondada para cima até a granularidade mais próxima com suporte no HyperDX. Essa granularidade calculada também precisa ser um múltiplo da granularidade da VIEW materializada.
- Não crie VIEWs materializadas com granularidade de 10 minutos. O ClickStack oferece suporte à granularidade de 15 minutos para gráficos e alertas, mas não à de 10 minutos. Portanto, uma VIEW materializada de 10 minutos seria incompatível com visualizações e alertas comuns de 15 minutos.
- Prefira granularidades de 1 minuto ou 1 hora, que se encaixam bem na maioria das configurações de gráficos e alertas.
Limite e consolide visões materializadas
- No máximo 20 VIEWs materializadas por source.
- Cerca de 10 VIEWs materializadas geralmente é o ideal.
- Consolide várias visualizações em uma única VIEW quando elas compartilharem dimensões em comum.
Escolha as dimensões com cuidado
- Cada coluna adicional de agrupamento aumenta o tamanho da VIEW.
- Equilibre a flexibilidade da consulta com o custo de armazenamento e de inserção.
- Filtros em colunas que não estão presentes na VIEW farão o ClickStack recorrer à tabela de origem.
DicaUm ponto de partida comum e quase sempre útil é uma VIEW materializada agrupada por nome do serviço com uma métrica de contagem, o que permite histogramas rápidos e visões gerais por serviço na busca e nos dashboards.
Convenções de nomenclatura para colunas de agregação
- Padrão:
<aggFn>__<sourceColumn> - Exemplos:
avg__Durationmax__Durationcount__para contagem de linhas
Quantis e seleção de sketch
quantilesproduz sketches maiores em disco, mas é mais barata de computar no momento da inserção.quantileTDigesté mais cara de computar no momento da inserção, mas produz sketches menores, o que muitas vezes resulta em consultas na VIEW mais rápidas.
quantile(0.5)) no momento da inserção para ambas as funções. O sketch resultante ainda pode ser consultado depois para outros valores de quantil, por exemplo quantile(0.95). Recomenda-se fazer testes para encontrar o melhor equilíbrio para sua carga de trabalho.
Validar a eficácia continuamente
- Confirme o uso por meio dos indicadores de aceleração na UI.
- Compare o desempenho das consultas antes e depois de habilitar a VIEW.
- Monitore o uso de recursos e o comportamento de mesclagem.
Configurações avançadas
- Dados recentes em alta resolução com visões históricas mais agregadas
- Visões no nível de serviço para visão geral e visões no nível de endpoint para diagnósticos detalhados
Limitações
Motivos comuns de incompatibilidade
- Intervalo de tempo da consulta O início do intervalo de tempo da consulta ocorre antes do timestamp mínimo da VIEW materializada. Como as VIEWs não recebem backfill automaticamente, elas só podem atender consultas para intervalos de tempo que cobrem integralmente.
-
Incompatibilidade de granularidade
A granularidade efetiva da visualização deve ser um múltiplo exato da granularidade da VIEW materializada. Especificamente:
- Para gráficos de tempo (gráficos de linha ou de barras com tempo no eixo x), a granularidade selecionada no gráfico deve ser um múltiplo da granularidade da VIEW. Por exemplo, um gráfico de 10 minutos pode usar VIEWs materializadas de 10, 5, 2 ou 1 minuto, mas não VIEWs de 20 minutos ou de 3 minutos.
- Para gráficos sem eixo temporal (gráficos de número ou tabelas), a granularidade efetiva é calculada como
(time range / 80), arredondada para cima até a granularidade mais próxima suportada pelo HyperDX, e também deve ser um múltiplo da granularidade da VIEW.
- Funções de agregação sem suporte A consulta solicita uma agregação que não está presente na VIEW materializada. Somente as agregações explicitamente calculadas e armazenadas na VIEW podem ser usadas.
-
Expressões de contagem personalizadas
Consultas que usam expressões como
count(if(...))ou outras contagens condicionais não podem ser derivadas de estados de agregação padrão e, portanto, não podem usar VIEWs materializadas.
Restrições de design e operação
- Sem backfilling automático VIEWs materializadas incrementais contêm apenas os dados inseridos após a criação. A aceleração de dados históricos exige backfilling explícito, o que pode ser caro ou impraticável para grandes conjuntos de dados.
- trade-offs de granularidade VIEWs com granularidade muito fina aumentam o tamanho do armazenamento e a sobrecarga no momento da inserção, enquanto VIEWs com granularidade mais grossa reduzem a flexibilidade. A granularidade deve ser escolhida com cuidado para corresponder aos padrões de consulta esperados.
- explosão de dimensões Adicionar muitas dimensões de agrupamento aumenta significativamente o tamanho da VIEW e pode reduzir sua eficácia. As VIEWs devem incluir apenas colunas de agrupamento e filtragem usadas com frequência.
- escalabilidade limitada no número de VIEWs Cada VIEW materializada adiciona sobrecarga no momento da inserção e contribui para a pressão de mesclagens. Criar VIEWs demais pode impactar negativamente a ingestão e as mesclagens em segundo plano.
Solução de problemas
Visão materializada não está sendo usada
- Abra o modal de otimização para ver se aparece “Intervalo de datas não compatível.”
- Verifique se o intervalo de datas da consulta é posterior à data mínima da visão materializada.
- Remova a data mínima se a visão materializada contiver todo o histórico de dados.
- Verifique se a granularidade do gráfico é múltipla da granularidade da MV.
- Tente definir o gráfico como “Auto” ou selecione manualmente uma granularidade compatível.
- Verifique se o gráfico usa agregações presentes na MV.
- Revise “Colunas agregadas disponíveis” no modal de otimização.
- Verifique se as colunas de agrupamento estão entre as colunas de dimensão da MV.
- Verifique “Colunas disponíveis para agrupar/filtrar” no modal de otimização.
Consultas lentas em visão materializada
- A MV tem linhas demais devido à granularidade muito fina (por exemplo, 1 segundo).
- Solução: crie uma MV com granularidade maior (por exemplo, 1 minuto ou 1 hora).
- A MV tem alta cardinalidade devido a muitas colunas de dimensão.
- Solução: reduza as colunas de dimensão às usadas com mais frequência.
- O sistema está executando
EXPLAINem cada MV. - Solução: remova MVs que raramente são usadas ou que são sempre ignoradas.
Erros de configuração
- Adicione pelo menos uma coluna agregada à configuração da MV.
- Especifique qual coluna deve ser agregada (apenas a contagem pode omitir a coluna de origem).
- Use uma das granularidades predefinidas na lista suspensa.
- O formato deve ser um intervalo SQL válido (por exemplo,
1 hour, não1 h).