Cómo consultar datos particionados en Synapse Serverless
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 Readeren 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?