Uma dúvida comum entre os usuários é quando devem usar visões materializadas ou projeções. Neste artigo, vamos explorar as principais diferenças entre as duas e por que você pode preferir uma à outra em determinados cenários.
Resumo das principais diferenças
Comparação entre visões materializadas e projeções
Quando escolher visões materializadas
- Estiver trabalhando com ETL em tempo real e pipelines de dados em vários estágios: você precisa realizar transformações complexas, agregações ou direcionar os dados à medida que eles chegam, possivelmente em vários estágios ao encadear visões.
- Precisar de desnormalização complexa: você precisa fazer JOIN prévio de dados de várias fontes (tabelas, subconsultas ou dicionários) em uma única tabela otimizada para consultas, especialmente se atualizações completas periódicas com o uso de visões materializadas atualizáveis forem aceitáveis.
- Quiser controle explícito de schema: você precisa de uma tabela de destino separada e distinta, com seu próprio schema e engine para os resultados pré-computados, oferecendo maior flexibilidade para modelagem de dados.
- Quiser filtrar durante a ingestão: você precisa filtrar os dados antes de serem materializados, reduzindo o volume de dados gravados na tabela de destino.
Quando evitar visões materializadas
- Os dados de origem são atualizados ou excluídos com frequência: Sem estratégias adicionais para garantir a consistência entre as tabelas de origem e de destino, as visões materializadas incrementais podem ficar desatualizadas e inconsistentes.
- Simplicidade e otimização automática são preferíveis: Se você quiser evitar o gerenciamento de tabelas de destino separadas.
Quando escolher projeções
- Otimizar consultas para uma única tabela: seu objetivo principal é acelerar consultas em uma única tabela base, oferecendo ordens de classificação alternativas, otimizando filtros em colunas que não fazem parte da chave primária ou pré-computando agregações para uma única tabela.
- Você quer transparência nas consultas: quer que as consultas tenham como alvo a tabela original sem modificações, contando com o ClickHouse para escolher a melhor organização de dados para uma determinada consulta.
Quando evitar projeções
- São necessárias transformações complexas de dados ou ETL em vários estágios: definições de projeção não oferecem suporte a operações
JOIN, não podem ser encadeadas para criar pipelines de várias etapas e não dão suporte a alguns recursos de SQL, como funções de janela ou instruçõesCASEcomplexas. Embora consultas em tabelas com projeções possam usarJOINlivremente, as próprias projeções não são adequadas para transformações de dados complexas. - É necessária a filtragem explícita dos dados materializados: projeções não oferecem suporte a cláusulas
WHEREem sua definição para filtrar os dados materializados na própria projeção. - São usados motores de tabela que não são da família MergeTree: projeções estão disponíveis exclusivamente para tabelas que usam a família de motores
MergeTree. - Consultas com
FINALsão essenciais: projeções não funcionam com consultasFINAL, que às vezes são usadas para desduplicação. - Você precisa de réplicas paralelas, pois elas não têm suporte com projeções.