Como criar e usar Materialized Views em Azure Synapse Analytics
Este tutorial mostra como criar e usar Materialized Views em Azure Synapse Analytics para acelerar consultas analíticas sobre grandes factos e reduzir custos de computação. Explico o porquê da técnica, quando usar Materialized Views e um exemplo prático com passos para criar, actualizar e validar uma Materialized View.
Pré-requisitos
- Workspace de Azure Synapse Analytics com Dedicated SQL Pool disponível.
- Permissões para criar objetos numa base de dados do Dedicated SQL Pool (CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW).
- Dados de origem carregados numa tabela facto (ex.: dbo.fact_sales) e dimensões (ex.: dbo.dim_date, dbo.dim_product).
- Conhecimentos básicos de T-SQL.
Passo 1: Por que usar Materialized Views em Azure Synapse Analytics
Materialized Views armazenam resultados de uma query materializada no disco, evitando reprocessamento completo em cada consulta. São úteis quando tens queries pesadas de agregação que são executadas frequentemente. Em Dedicated SQL Pool melhoram latência e reduzem uso de recurso, mas exigem manutenção (refresh) quando os dados mudam.
Passo 2: Criar a tabela de exemplo
Se ainda não tens tabelas de exemplo, cria uma tabela facto simples e popula com alguns registos para testar. Aqui está um exemplo mínimo para testar a Materialized View.
CREATE TABLE dbo.fact_sales (
sale_id BIGINT NOT NULL,
product_id INT NOT NULL,
sale_date DATE NOT NULL,
quantity INT,
amount DECIMAL(18,2)
);
INSERT INTO dbo.fact_sales (sale_id, product_id, sale_date, quantity, amount)
VALUES (1, 100, '2026-01-01', 2, 19.98),
(2, 101, '2026-01-02', 1, 9.99),
(3, 100, '2026-01-02', 3, 29.97);
Passo 3: Criar uma Materialized View de agregação
Decide a agregação que precisas frequentemente. Aqui criamos uma Materialized View com vendas por product_id e mês. Em Dedicated SQL Pool a sintaxe é CREATE MATERIALIZED VIEW. Importante: a query tem restrições (não suportam funções não determinísticas, etc.).
CREATE MATERIALIZED VIEW dbo.mv_sales_monthly
WITH (DISTRIBUTION = HASH(product_id), CLUSTERED COLUMNSTORE INDEX)
AS
SELECT
product_id,
DATEFROMPARTS(YEAR(sale_date), MONTH(sale_date), 1) AS month_start,
SUM(quantity) AS total_qty,
SUM(amount) AS total_amount
FROM dbo.fact_sales
GROUP BY product_id, DATEFROMPARTS(YEAR(sale_date), MONTH(sale_date), 1);
Passo 4: Verificar propriedades e limitações
Confirma que a Materialized View foi criada e que tem um objecto fisicamente armazenado. Consulta metadata para ver distribuição e índices. Lembra-te que Materialized Views em Dedicated SQL Pool são actualizadas quando as operações de DML ocorrem, mas tens opções para controlar refreshes e manutenção se fizeres loads em massa.
-- Verificar existência
SELECT name, type_desc FROM sys.objects WHERE name = 'mv_sales_monthly';
-- Ver detalhes de índices
SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.mv_sales_monthly');
Passo 5: Consultar a Materialized View (exemplo de uso)
Após criada, as queries que a utilizam podem ser muito mais rápidas. Exemplo simples de consulta que beneficia da Materialized View:
SELECT product_id, month_start, total_qty, total_amount
FROM dbo.mv_sales_monthly
WHERE month_start = '2026-01-01';
Passo 6: Atualizar os dados e forçar refresh
Se fizeres loads em massa na tabela base com COPY/CTAS ou usando etapas em massa, confirma que a Materialized View reflecte os novos dados. Em Dedicated SQL Pool podes recriar a MV ou usar técnicas de manutenção. Uma operação comum é DROP + CREATE quando fazes reload massivo; para cargas incrementais, assegura que as operações DML disparam actualização.
-- Exemplo: inserir novos registos
INSERT INTO dbo.fact_sales (sale_id, product_id, sale_date, quantity, amount)
VALUES (4, 100, '2026-01-15', 1, 9.99);
-- Dependendo da forma como carregaste, podes precisar de rebuild:
ALTER MATERIALIZED VIEW dbo.mv_sales_monthly REBUILD; -- se suportado
-- Se REBUILD não estiver disponível no teu cenário, usa DROP + CREATE
Verificar o resultado
Consulta a Materialized View e compara com agregação directa da tabela base. Mede tempos de execução para ver a melhoria e confirma que os valores coincidem (ou que a diferença corresponde a cargas pendentes).
-- Comparar resultados
SELECT product_id, month_start, total_qty, total_amount
FROM dbo.mv_sales_monthly
ORDER BY product_id, month_start;
-- Agregação directa (mais lenta)
SELECT product_id,
DATEFROMPARTS(YEAR(sale_date), MONTH(sale_date), 1) AS month_start,
SUM(quantity) AS total_qty,
SUM(amount) AS total_amount
FROM dbo.fact_sales
GROUP BY product_id, DATEFROMPARTS(YEAR(sale_date), MONTH(sale_date), 1)
ORDER BY product_id, month_start;
Conclusão
Materialized Views em Azure Synapse Analytics são uma ferramenta poderosa para acelerar queries analíticas em Dedicated SQL Pool, reduzindo latência e custos de CPU quando usadas corretamente. Próximos passos: testar com datasets maiores, definir políticas de refresh para cargas batch e analisar distribuição/índices para optimizar performance. Dica: verifica sempre limitações de expressão na definição da view e testa o comportamento após cargas massivas — já experimentaste medir a melhoria com o mesmo cenário de consulta antes/depois?