Como criar views materializadas em Lakehouse: passo a passo
Este tutorial mostra como criar views materializadas em Lakehouse para acelerar consultas analíticas frequentes. As materialized views reduzem I/O e melhoram o desempenho ao pré-agregar ou pré-filtrar dados, útil para relatórios e dashboards no Power BI ou análises ad-hoc.
Pré-requisitos
- Instância Lakehouse com tabelas Delta acessíveis (por exemplo em Microsoft Fabric).
- Permissões para criar objetos SQL e agendar jobs.
- Ferramenta SQL para executar comandos (SQL endpoint, Synapse ou interface do Fabric).
Passo 1: Escolher o caso de uso e a consulta base
Decida que consulta é onerosa e beneficia de materialização: agregação por dia, top N, ou junção pesada. A consulta base deve ser determinística e relativamente estável. Exemplo: agregação diária de vendas por produto.
-- Consulta base: total de vendas por product_id por dia
SELECT
product_id,
CAST(sale_date AS DATE) AS sale_day,
SUM(amount) AS total_sales,
COUNT(*) AS sales_count
FROM sales_delta
GROUP BY product_id, CAST(sale_date AS DATE);
Passo 2: Criar uma tabela Delta para armazenar a materialização
Uma materialized view em muitos ambientes Lakehouse é implementada como uma tabela pré-computada (Delta). Crie uma tabela Delta para guardar o resultado e escolha a partition adequada (por exemplo sale_day) para consultas eficientes.
CREATE TABLE IF NOT EXISTS mv_sales_by_day
USING DELTA
PARTITIONED BY (sale_day)
AS
SELECT
product_id,
CAST(sale_date AS DATE) AS sale_day,
SUM(amount) AS total_sales,
COUNT(*) AS sales_count
FROM sales_delta
GROUP BY product_id, CAST(sale_date AS DATE);
Passo 3: Implementar refresh inicial e incremental (ETL/ELT)
O refresh pode ser completo (truncate+insert) ou incremental. Para desempenho, faça incremental usando uma coluna updated_at ou uma tabela de CDC. Aqui mostramos um exemplo simples baseado em updated_at: actualizamos os dias alterados desde a última execução.
-- Exemplo: identificar dias alterados
WITH changed_days AS (
SELECT DISTINCT CAST(sale_date AS DATE) AS sale_day
FROM sales_delta
WHERE updated_at >= DATEADD(day, -1, current_timestamp()) -- último dia
)
-- Recalcular apenas os dias alterados
MERGE INTO mv_sales_by_day AS target
USING (
SELECT
product_id,
sale_day,
SUM(amount) AS total_sales,
COUNT(*) AS sales_count
FROM sales_delta
WHERE CAST(sale_date AS DATE) IN (SELECT sale_day FROM changed_days)
GROUP BY product_id, CAST(sale_date AS DATE)
) AS src
ON target.product_id = src.product_id AND target.sale_day = src.sale_day
WHEN MATCHED THEN
UPDATE SET total_sales = src.total_sales, sales_count = src.sales_count
WHEN NOT MATCHED
THEN INSERT (product_id, sale_day, total_sales, sales_count) VALUES (src.product_id, src.sale_day, src.total_sales, src.sales_count);
Passo 4: Agendar refresh e tratar falhas
Automatize o refresh com um job scheduler (ex.: Azure Data Factory, Synapse pipelines, ou o scheduler do Fabric). Configure alertas para falhas e retenção de logs para auditoria. Defina frequência conforme SLA: cada minuto, cada hora ou diário.
-- Pseudocódigo do job: executar script de MERGE acima
-- No scheduler, criar pipeline que executa query SQL no endpoint do Lakehouse
-- Definir política de retry e notificação em caso de erro
Passo 5: Otimizações e manutenção
Monitorize o tamanho e a fragmentação da tabela Delta materializada. Execute OPTIMIZE e ZORDER se disponível para reduzir ficheiros pequenos e acelerar filtros por colunas frequentes. Reavalie partições e, se necessário, faça um refresh completo periodicamente.
-- Exemplos comuns de manutenção
OPTIMIZE mv_sales_by_day ZORDER BY (product_id);
-- Se existir suporte, usar VACUUM com cuidado para remover ficheiros antigos
VACUUM mv_sales_by_day RETAIN 168 HOURS; -- não apagar historial recente
Verificar o resultado
Confirme que a tabela materializada acelera consultas comparando tempos antes/depois. Teste uma query típica e verifique que os dados correspondem à origem e que o job de refresh actualiza as alterações.
-- Teste de desempenho e validade
EXPLAIN SELECT product_id, total_sales FROM mv_sales_by_day WHERE sale_day = '2026-10-01' ORDER BY total_sales DESC LIMIT 10;
-- Comparação simples de contagens
SELECT SUM(total_sales) FROM mv_sales_by_day WHERE sale_day = '2026-10-01';
SELECT SUM(amount) FROM sales_delta WHERE CAST(sale_date AS DATE) = '2026-10-01';
Conclusão
Criar materialized views em Lakehouse com uma tabela Delta permite acelerar consultas e reduzir custos de I/O. Próximos passos: integrar com Power BI, implementar refresh baseado em CDC para menor latência e automatizar alertas. Dica: comece com agregações simples e monitorize o custo/benefício antes de materializar tudo.