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

Como consultar dados particionados no Synapse Serverless

João Barros 06 de July de 2026 4 min de leitura

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 Reader na 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?