Pular para o conteúdo principal
Views materializadas atualizáveis são conceitualmente semelhantes às visões materializadas em bancos de dados OLTP tradicionais: armazenam o resultado de uma consulta especificada para recuperação rápida e reduzem a necessidade de executar repetidamente consultas que consomem muitos recursos. Diferentemente das views materializadas incrementais do ClickHouse, elas exigem a execução periódica da consulta sobre todo o conjunto de dados — e os resultados são armazenados em uma tabela de destino para consulta. Em teoria, esse conjunto de resultados deve ser menor que o conjunto de dados original, permitindo que a consulta subsequente seja executada mais rapidamente. O diagrama explica como as views materializadas atualizáveis funcionam: Você também pode assistir ao vídeo a seguir:

Quando as views materializadas atualizáveis devem ser usadas?

As views materializadas incrementais do ClickHouse são extremamente poderosas e, em geral, escalam muito melhor do que a abordagem usada pelas views materializadas atualizáveis, especialmente nos casos em que é necessário executar uma agregação sobre uma única tabela. Como a agregação é calculada apenas em cada bloco de dados à medida que ele é inserido, e os estados incrementais são mesclados na tabela final, a consulta sempre é executada sobre apenas um subconjunto dos dados. Esse método pode escalar para petabytes de dados e, em geral, é o preferido. No entanto, há casos de uso em que esse processo incremental não é necessário ou não se aplica. Alguns problemas são incompatíveis com uma abordagem incremental ou não exigem atualizações em tempo real, e uma recriação periódica é mais apropriada. Por exemplo, você pode querer recalcular regularmente uma view completa sobre todo o dataset porque ela usa um join complexo, o que é incompatível com uma abordagem incremental.
As views materializadas atualizáveis podem executar processos em lote para realizar tarefas como desnormalização. É possível criar dependências entre views materializadas atualizáveis, de modo que uma view dependa dos resultados de outra e só seja executada depois que ela for concluída. Isso pode substituir fluxos de trabalho agendados ou DAGs simples, como um job do dbt. Para saber mais sobre como definir dependências entre views materializadas atualizáveis, acesse CREATE VIEW, na seção Dependencies.

Como atualizar uma view materializada atualizável?

Views materializadas atualizáveis são atualizadas automaticamente no intervalo definido durante a criação. Por exemplo, a seguinte visão materializada é atualizada a cada minuto:
Se você quiser forçar a atualização de uma visão materializada, pode usar a cláusula SYSTEM REFRESH VIEW:
Você também pode cancelar, interromper ou iniciar uma view. Para mais detalhes, consulte a documentação sobre como gerenciar views materializadas atualizáveis.

Quando uma view materializada atualizável foi atualizada pela última vez?

Para descobrir quando uma view materializada atualizável foi atualizada pela última vez, você pode consultar a tabela de sistema system.view_refreshes, como mostrado abaixo:

Como posso alterar a frequência de atualização?

Para alterar a frequência de atualização de uma view materializada atualizável, use a sintaxe ALTER TABLE...MODIFY REFRESH.
Depois de fazer isso, você pode usar a consulta Quando uma view materializada atualizável foi atualizada pela última vez? para verificar se a frequência foi atualizada:

Usando APPEND para adicionar novas linhas

A funcionalidade APPEND permite adicionar novas linhas ao final da tabela, em vez de substituir toda a view. Um dos usos desse recurso é capturar snapshots de valores em um determinado momento. Por exemplo, imagine que temos uma tabela events populada por um fluxo de mensagens do Kafka, Redpanda ou de outra plataforma de dados em streaming.
Este conjunto de dados tem 4096 valores na coluna uuid. Podemos escrever a seguinte consulta para encontrar aqueles com a maior contagem total:
Digamos que queremos registrar a contagem de cada uuid a cada 10 segundos e armazená-la em uma nova tabela chamada events_snapshot. O esquema de events_snapshot seria assim:
Podemos então criar uma view materializada atualizável para popular esta tabela:
Em seguida, podemos consultar events_snapshot para obter a contagem ao longo do tempo para um uuid específico:

Exemplos

Agora, vamos ver como usar views materializadas atualizáveis com alguns conjuntos de dados de exemplo.

Stack Overflow

O guia de desnormalização de dados mostra várias técnicas para desnormalizar dados usando um conjunto de dados do Stack Overflow. Carregamos dados nas seguintes tabelas: votes, users, badges, posts e postlinks. Nesse guia, mostramos como desnormalizar os dados de postlinks na tabela posts com a seguinte consulta:
Em seguida, mostramos como fazer uma inserção única desses dados na tabela posts_with_links, mas, em um sistema de produção, o ideal seria executar essa operação periodicamente. Tanto a tabela posts quanto a postlinks podem ser atualizadas. Portanto, em vez de tentar implementar esse join usando views materializadas incrementais, pode ser suficiente simplesmente agendar essa consulta para ser executada em um intervalo fixo, por exemplo, uma vez por hora, armazenando os resultados em uma tabela post_with_links. É nesse ponto que uma view materializada atualizável ajuda, e podemos criar uma com a seguinte consulta:
A view será executada imediatamente e, em seguida, a cada hora, conforme configurado, para garantir que as atualizações da tabela de origem sejam refletidas. É importante observar que, quando a consulta for executada novamente, o conjunto de resultados será atualizado de forma atômica e transparente.
A sintaxe aqui é idêntica à de uma view materializada incremental, exceto por incluir uma cláusula REFRESH:

IMDb

No guia de integração do dbt com o ClickHouse, populamos um conjunto de dados do IMDb com as seguintes tabelas: actors, directors, genres, movie_directors, movies e roles. Em seguida, podemos escrever a consulta a seguir para gerar um resumo de cada ator, ordenado pelo maior número de aparições em filmes.
Não demora muito para retornar um resultado, mas digamos que queremos que ele seja ainda mais rápido e exija menos processamento. Suponha que esse conjunto de dados também esteja sujeito a atualizações constantes - novos filmes são lançados o tempo todo, e novos atores e diretores também surgem. É hora de usar uma view materializada atualizável, então primeiro vamos criar uma tabela de destino para os resultados:
E agora podemos definir a view:
A view será executada imediatamente e, depois disso, a cada minuto, conforme configurado, para garantir que as atualizações na tabela de origem sejam refletidas. Nossa consulta anterior para obter um resumo dos atores fica sintaticamente mais simples e significativamente mais rápida!
Suponha que adicionemos aos nossos dados um novo ator, “Clicky McClickHouse”, que por acaso apareceu em muitos filmes!
Menos de 60 segundos depois, nossa tabela de destino é atualizada para refletir a prolífica atuação de Clicky:
Última modificação em 3 de julho de 2026