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

Cómo consultar datos particionados en Synapse Serverless

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

Cuando un Data Lake crece hasta millones de ficheros, leerlos todos en cada consulta se vuelve lento y caro. En el serverless SQL pool de Azure Synapse puede organizar los ficheros en carpetas y leer solo las que necesita, usando OPENROWSET con wildcards y la función filepath(). El resultado es consultar datos particionados de forma rápida, pagando solo por los datos que recorre cada consulta.

Requisitos previos

  • Un workspace de Azure Synapse Analytics con el endpoint serverless SQL (Built-in).
  • Ficheros Parquet (o CSV) en una cuenta de Azure Data Lake Storage Gen2.
  • El rol Storage Blob Data Reader en la cuenta de almacenamiento.
  • Un editor de SQL: Synapse Studio o Azure Data Studio.

Paso 1: Organizar los ficheros en carpetas particionadas

La partición empieza por cómo se guardan los ficheros. La convención más habitual es una carpeta por valor de partición, con el formato columna=valor. Por ejemplo, para ventas organizadas por año y mes:

vendas/
  ano=2025/
    mes=11/ parte-001.parquet
    mes=12/ parte-001.parquet
  ano=2026/
    mes=01/ parte-001.parquet

Este patrón, conocido como Hive-style partitioning, lo reconoce Synapse y permite que una consulta se salte carpetas enteras cuando filtra por año o por mes. Cuanto más equilibradas estén las particiones, mejor será el rendimiento.

Paso 2: Leer todos los ficheros con OPENROWSET

Empiece por consultar todo el árbol de carpetas usando wildcards (*) en la ruta. Un * corresponde a una carpeta y *.parquet a cualquier fichero 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 lee todos los ficheros. Todavía no hay filtro de partición: es solo el punto de partida.

Paso 3: Exponer las particiones con filepath()

La función filepath(n) devuelve el valor que capturó el n-ésimo wildcard de la ruta. Como tenemos dos * (año y mes), filepath(1) devuelve el año (ano) y filepath(2) el mes (mes):

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;

Fíjese en que las columnas de partición (año, mes) no están dentro del fichero Parquet: provienen del nombre de la carpeta, a través de filepath().

Paso 4: Filtrar particiones para recorrer menos datos

Aquí está el truco que ahorra tiempo y dinero. Cuando filtra por filepath() en la cláusula WHERE, el serverless SQL pool aplica partition elimination (eliminación de particiones): determina por la ruta qué carpetas son relevantes y ni siquiera abre las demás.

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 filtró filepath(1) = '2026', el motor lee solo la carpeta ano=2026 e ignora las demás. Si filtrara también filepath(2), reduciría aún más los datos recorridos.

Paso 5: Guardar la consulta en una VIEW

Para reutilizarla sin repetir la ruta, cree una VIEW en una base de datos del 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 de ahí, un simple SELECT ... FROM dbo.vw_vendas WHERE ano = '2026' mantiene la eliminación de particiones en funcionamiento.

Verificar el resultado

Confirme dos cosas. Primero, que los valores de año (ano) y mes (mes) aparecen correctos en los resultados: eso prueba que filepath() está leyendo las carpetas correctas. Segundo, abra la pestaña de mensajes/estadísticas y compare los datos procesados (data processed) entre la consulta sin filtro (Paso 3) y la consulta con filtro (Paso 4): la segunda debería recorrer muchos menos. En el serverless SQL pool el coste se basa en los datos recorridos, así que menos datos significa menos coste.

Conclusión

Con carpetas particionadas, OPENROWSET y filepath(), lee solo lo que necesita, haciendo las consultas más rápidas y baratas. El siguiente paso es convertir los datos de uso frecuente a Parquet particionado con CETAS y acordar una convención de carpetas coherente para todo el equipo. ¿Qué dimensión tiene más sentido para particionar sus datos: fecha, región o cliente?