(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar views materializadas em Lakehouse: passo a passo

João Barros 17 de October de 2026 4 min de leitura

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.