Cuando lees archivos Parquet desde S3 con httpfs en DuckDB, DuckDB puede empujar la proyección de columnas y los filtros por row group directamente hacia HTTP range requests. Es decir: descarga solo los bytes que realmente necesita.
Mueve los controles de abajo y observa cómo las estadísticas, el tamaño de row-group, la selectividad y la proyección de columnas cambian cuántos datos cruzan realmente la red:
interactivo · simulador de pushdown
98% I/O ahorrado
Stats válidas → DuckDB salta row groups y lee solo las columnas seleccionadas. 98% menos de datos por la red.
El modelo asume que la columna del predicado está clustered. Row groups grandes hacen el skipping más grueso, así que grupos pequeños + stats válidas ganan.
INSTALL httpfs;
LOAD httpfs;
SET s3_region = 'eu-west-1';
-- Lee solo las columnas ts y value
-- Row groups con ts < '2026-01-01' se saltan completos si las estadísticas son válidas
SELECT ts, value
FROM read_parquet('s3://my-bucket/events/*.parquet')
WHERE ts >= '2026-01-01'
AND value > 100
LIMIT 1000;El matiz: el pushdown funciona bien solo si:
- El footer del archivo Parquet incluye column statistics
- El tamaño del row group es razonable; row groups enormes reducen mucho la eficiencia
- La columna usada en el predicado tiene algo de selectividad
Puedes comprobar las estadísticas así:
import pyarrow.parquet as pq
pf = pq.ParquetFile("events.parquet")
print(pf.metadata.row_group(0).column(0).statistics)
# => <pyarrow._parquet.Statistics object>
# has_min_max: True, min: 2026-01-01, max: 2026-01-31Si has_min_max == False, tu WHERE probablemente no evitará un full scan.