| Armazenamento e localização dos dados | Armazenam seus resultados em uma tabela de destino separada e explícita, atuando como gatilhos de inserção durante o INSERT em uma tabela de origem. | As projeções criam layouts de dados otimizados que são fisicamente armazenados junto com os dados da tabela principal e ficam invisíveis para o usuário. |
| Mecanismo de atualização | Operam de forma síncrona no INSERT para a tabela de origem (no caso de visões materializadas incrementais). Observação: elas também podem ser agendadas usando visões materializadas atualizáveis. | Atualizações assíncronas em segundo plano após o INSERT na tabela principal. |
| Interação com consultas | Trabalhar com visões materializadas exige consultar a tabela de destino diretamente, o que significa que você precisa estar ciente da existência das visões materializadas ao escrever consultas. | As projeções são selecionadas automaticamente pelo otimizador de consultas do ClickHouse e são transparentes, no sentido de que o usuário não precisa modificar suas consultas na tabela com a projeção para usá-la. A partir da versão 25.6, também é possível filtrar por mais de uma projeção. |
Tratamento de UPDATE / DELETE | Não reagem automaticamente a operações UPDATE ou DELETE na tabela de origem, pois as visões materializadas não têm conhecimento da tabela de origem, atuando apenas como gatilhos de inserção em uma tabela de origem. Isso pode levar a dados potencialmente desatualizados entre as tabelas de origem e de destino e exige soluções alternativas ou atualização completa periódica. (via visão materializada atualizável). | Por padrão, são incompatíveis com linhas DELETED (especialmente exclusões leves). lightweight_mutation_projection_mode (v24.7+) pode habilitar compatibilidade. |
Suporte a JOIN | Sim. Visões materializadas atualizáveis podem ser usadas para desnormalização complexa. Visões materializadas incrementais só são acionadas em inserções na tabela mais à esquerda. | Não. Operações JOIN não são suportadas em definições de projeção para filtrar os dados materializados. No entanto, consultas que fazem join de tabelas com projeções funcionam normalmente — as projeções otimizam o acesso a tabelas individuais. |
Cláusula WHERE na definição | Sim. Cláusulas WHERE podem ser incluídas para filtrar os dados antes da materialização. | Não. Cláusulas WHERE não são suportadas em definições de projeção para filtrar os dados materializados. |
| Capacidades de encadeamento | Sim, a tabela de destino de uma visão materializada pode ser a origem de outra visão materializada, permitindo pipelines de vários estágios. | Não. Projeções não podem ser encadeadas. |
| Motores de tabela aplicáveis | Podem ser usadas com vários motores de tabela de origem, mas as tabelas de destino geralmente pertencem à família MergeTree. | Disponíveis apenas para motores de tabela da família MergeTree. |
| Tratamento de falhas | Falhas durante a inserção de dados significam perda de dados na tabela de destino, o que pode levar a inconsistências. | As falhas são tratadas silenciosamente em segundo plano. As consultas podem misturar de forma transparente partes materializadas e não materializadas. |
| Sobrecarga operacional | Exige criação explícita da tabela de destino e, muitas vezes, backfill manual. Gerenciar a consistência com UPDATE/DELETE aumenta a complexidade. | As projeções são mantidas automaticamente e sincronizadas e, em geral, têm menor carga operacional. |
Compatibilidade com consultas FINAL | Geralmente compatíveis, mas frequentemente exigem GROUP BY na tabela de destino. | Não funcionam com consultas FINAL. |
| Materialização preguiçosa | Sim. | Monitore problemas de compatibilidade de projeção ao usar recursos de materialização. Pode ser necessário definir query_plan_optimize_lazy_materialization = false |
| Réplicas paralelas | Sim. | Não. |
optimize_read_in_order | Sim. | Sim. |
| Atualizações leves e exclusões leves | Sim. | Não. |