A lacuna de reescrita de consultas em Materialized Views com suporte a Join
Aprofundamento CEVIU
Aprofundamento
O suporte a reescrita de consultas em materialized views com JOIN não é só sobre desempenho: é uma questão de alinhamento entre modelo lógico e execução física. Em star-schema, dashboards frequentemente agrupam por atributos de dimensão (ex: 'cidade', 'categoria') que não estão fisicamente presentes na tabela fato, mas aparecem em joins pré-materializados. Quando o otimizador consegue substituir uma query que junta fato + dimensão por uma leitura direta da view materializada com join embutido, ele evita shuffle, reduz dados transferidos entre nós e ignora etapas de execução que geram custo oculto, exatamente o gargalo que o CEVIU já havia identificado no BigQuery (2026-05-11). Isso só funciona se houver estatísticas confiáveis sobre cardinalidade e distribuição das chaves de join, algo que engines em lakehouse ainda enfrentam como problema estrutural, conforme mostrado em nossa cobertura sobre estatísticas fragmentadas (2026-05-14).
Além disso, a eficácia dessa reescrita depende do layout físico dos dados. Views materializadas com join só entregam ganhos consistentes se as tabelas envolvidas usarem estratégias de organização que minimizem I/O aleatório, como o Liquid Clustering da Databricks, que, ao contrário do particionamento rígido, mantém dados relacionados próximos mesmo após atualizações incrementais (2026-06-04). Sem isso, a view pode ser tecnicamente válida, mas lentíssima para leitura sequencial.
O que mudou
Antes, a Databricks oferecia Metric Views apenas como feature experimental com restrições fortes: sem suporte a JOINs entre múltiplas tabelas, sem reescrita automática em queries ad hoc e dependência total de um catálogo Delta com metadados completos. Com a nova versão lançada em 2026-06-08, Metric Views passam a aceitar definições com JOIN explícito, habilitando reescrita em cenários de star-schema, mas ainda exigem que os dados subjacentes estejam sob Liquid Clustering e que estatísticas sejam atualizadas via ANALYZE manual, diferentemente do BigQuery ou StarRocks, que fazem isso automaticamente.
Por que isso importa
Essa lacuna não é técnica, é operacional. Time de BI que migra de um warehouse tradicional para um lakehouse acaba escrevendo queries redundantes, duplicando lógica de join em dezenas de dashboards, porque a engine não reconhece que já existe uma versão materializada com aquele padrão. O resultado é maior consumo de recursos, inconsistência de resultados (quando uma dimensão é atualizada mas a view não) e dificuldade de governança. Fechar essa lacuna significa que time de dados pode modelar camadas analíticas com a mesma confiança de um data warehouse, sem sacrificar flexibilidade de schema ou controle de custo no lakehouse.
Linha do tempo
CEVIU explica que o principal custo oculto no BigQuery é o shuffle, não os bytes escaneados
CEVIU mostra que engines em lakehouse falham em otimizar JOINs por falta de estatísticas confiáveis
Polars 1.41 melhora eliminação de subplanos comuns, antecipando necessidade de reescrita inteligente
Databricks reforça que Liquid Clustering é essencial para performance de JOINs em ambientes dinâmicos
Nova análise revela lacuna de reescrita de consultas em materialized views com suporte a JOIN
Perguntas frequentes
Por que o Snowflake não tem reescrita automática com JOIN em materialized views?
O Snowflake separa funções: materialized views são estáticas e não suportam JOINs; Dynamic Tables permitem transformações incrementais com JOINs, mas não participam de reescrita de consultas. A reescrita exige que a engine compreenda equivalência lógica entre a query original e a view, algo que exige metadados mais ricos do que os atuais no Snowflake, especialmente sobre dependências entre colunas após JOIN.
Como saber se minha query vai realmente usar a materialized view com JOIN?
Em plataformas como BigQuery ou StarRocks, use EXPLAIN ou o plano de execução detalhado. Se a saída mostrar 'Rewritten using materialized view' ou 'Used materialized view XYZ', a reescrita ocorreu. Em Databricks com Metric Views, verifique o campo 'optimizedPlan' no Spark UI: se contiver 'MetricViewRelation', a reescrita foi aplicada, caso contrário, a query executou o JOIN original.
Posso usar Apache Iceberg registerView para simular esse comportamento?
Não diretamente. O registerView do Iceberg (lançado em 1.11.0) registra views SQL existentes como objetos de catálogo, mas não as materializa nem habilita reescrita. Ele resolve migração de metadados, não otimização de execução. Para reescrita com JOIN, você precisa de uma engine que suporte tanto a materialização quanto o rewrite rule, como o Trino com Iceberg + custom connector, ou o StarRocks com sua camada de query rewrite.
Qual o impacto do Liquid Clustering nessa reescrita?
Impacto crítico. Sem Liquid Clustering, dados de dimensões e fatos ficam espalhados por arquivos diferentes, forçando leituras amplas mesmo quando a view materializada é usada. O Liquid Clustering garante que chaves de join (ex: product_id) estejam localmente agrupadas em blocos físicos, o que reduz drasticamente o número de arquivos lidos durante a reescrita, tornando-a viável em escala. É o que diferencia uma 'materialização teórica' de uma 'materialização prática'.
- Categoria
- CEVIU Dados
- Publicado
- 08 de junho de 2026
- Fonte
- CEVIU Dados
