Como consultar dados particionados no Synapse Serverless
Quando um Data Lake cresce para milhões de ficheiros, ler tudo em cada consulta torna-se lento e caro. No Azure Synapse serverless SQL pool pode organizar os ficheiros por pastas e ler apenas as que interessam, usando OPENROWSET com wildcards e a função filepath(). O resultado é consultar dados particionados de forma rápida, pagando só pelos dados que a consulta percorre.
Pré-requisitos
- Um workspace do Azure Synapse Analytics com o endpoint serverless SQL (Built-in).
- Ficheiros Parquet (ou CSV) num Azure Data Lake Storage Gen2.
- Permissão
Storage Blob Data Readerna conta de armazenamento. - Um editor de SQL: Synapse Studio ou Azure Data Studio.
Passo 1: Organizar os ficheiros em pastas particionadas
A partição começa na forma como os ficheiros são guardados. A convenção mais usada é uma pasta por valor de partição, no formato coluna=valor. Por exemplo, para vendas organizadas por ano e mês:
vendas/
ano=2025/
mes=11/ parte-001.parquet
mes=12/ parte-001.parquet
ano=2026/
mes=01/ parte-001.parquet
Este padrão, conhecido como Hive-style partitioning, é reconhecido pelo Synapse e permite que a consulta salte pastas inteiras quando filtra por ano ou por mês. Quanto mais equilibradas forem as partições, melhor o desempenho.
Passo 2: Ler todos os ficheiros com OPENROWSET
Comece por consultar toda a árvore de pastas usando wildcards (*) no caminho. Um * corresponde a uma pasta e *.parquet a qualquer ficheiro Parquet:
SELECT COUNT_BIG(*) AS total_linhas
FROM OPENROWSET(
BULK 'https://minhaconta.dfs.core.windows.net/dados/vendas/ano=*/mes=*/*.parquet',
FORMAT = 'PARQUET'
) AS r;
Esta consulta lê todos os ficheiros. Ainda não há filtro de partição — é apenas o ponto de partida.
Passo 3: Expor as partições com filepath()
A função filepath(n) devolve o valor que o n-ésimo wildcard capturou no caminho. Como temos dois * (ano e mês), filepath(1) devolve o ano e filepath(2) o mês:
SELECT
r.filepath(1) AS ano,
r.filepath(2) AS mes,
COUNT_BIG(*) AS linhas
FROM OPENROWSET(
BULK 'https://minhaconta.dfs.core.windows.net/dados/vendas/ano=*/mes=*/*.parquet',
FORMAT = 'PARQUET'
) AS r
GROUP BY r.filepath(1), r.filepath(2)
ORDER BY ano, mes;
Repare que as colunas de partição (ano, mês) não estão dentro do ficheiro Parquet — vêm do nome da pasta, através de filepath().
Passo 4: Filtrar partições para percorrer menos dados
Aqui está o truque que poupa tempo e dinheiro. Quando filtra por filepath() na cláusula WHERE, o serverless SQL pool aplica partition elimination: identifica pelo caminho quais as pastas relevantes e nem chega a abrir as restantes.
SELECT r.filepath(2) AS mes, COUNT_BIG(*) AS linhas
FROM OPENROWSET(
BULK 'https://minhaconta.dfs.core.windows.net/dados/vendas/ano=*/mes=*/*.parquet',
FORMAT = 'PARQUET'
) AS r
WHERE r.filepath(1) = '2026'
GROUP BY r.filepath(2)
ORDER BY mes;
Como filtrou filepath(1) = '2026', o motor lê apenas a pasta ano=2026 e ignora as outras. Se filtrasse também filepath(2), reduziria ainda mais os dados percorridos.
Passo 5: Guardar a consulta numa VIEW
Para reutilizar sem repetir o caminho, crie uma VIEW numa base de dados do serverless SQL:
CREATE VIEW dbo.vw_vendas AS
SELECT
r.filepath(1) AS ano,
r.filepath(2) AS mes,
r.*
FROM OPENROWSET(
BULK 'https://minhaconta.dfs.core.windows.net/dados/vendas/ano=*/mes=*/*.parquet',
FORMAT = 'PARQUET'
) AS r;
A partir daí, um simples SELECT ... FROM dbo.vw_vendas WHERE ano = '2026' mantém a eliminação de partições a funcionar.
Verificar o resultado
Confirme duas coisas. Primeiro, que os valores de ano e mês aparecem corretos nos resultados — isso prova que o filepath() está a ler as pastas certas. Segundo, abra o separador de mensagens/estatísticas e compare os dados processados (data processed) entre a consulta sem filtro (Passo 3) e a consulta com filtro (Passo 4): a segunda deve percorrer muito menos. No serverless SQL pool o custo baseia-se nos dados percorridos, por isso menos dados significa menos custo.
Conclusão
Com pastas particionadas, OPENROWSET e filepath(), passa a ler só o que precisa, tornando as consultas mais rápidas e baratas. O próximo passo é converter os dados de uso frequente para Parquet particionado com CETAS e combinar uma convenção de pastas consistente para toda a equipa. Que dimensão faz mais sentido para particionar os seus dados — data, região ou cliente?