DuckDB v0.10.2中Parquet多条件谓词下推失效问题咨询
DuckDB v0.10.2中Parquet多Symbol OR过滤无法谓词下推的问题
我有一个按instrument-symbol排序并分块的Tick数据Parquet文件,其元数据包含symbol字段的min/max信息。测试发现两种过滤场景的执行差异:
1. 单个Symbol过滤:谓词下推生效
执行SQL:
explain analyse SELECT * from "/data/phil/cme_312.parquet" AS t WHERE t.symbol = 'SR3Z3';
执行计划:
┌─────────────┴─────────────┐ │ PARQUET_SCAN │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ symbol │ │ event_type │ │ side │ │ symbol_idx │ │ epoch │ │ price │ │ quantity │ │ msg_seq_num │ │ transact_time │ │ n_orders │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ Filters: symbol=SR3Z3 AND │ │ symbol IS NOT NULL │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ EC: 2820388 │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ 250614 │ │ (0.36s) │ └───────────────────────────┘
从执行计划可见,DuckDB将过滤条件下推到Parquet扫描层,仅扫描包含SR3Z3的分块,最终返回250614行,耗时0.36秒,谓词下推生效。
2. 多个Symbol OR过滤:全量扫描
执行SQL:
explain analyse SELECT * from "/data/phil/cme_312.parquet" AS t WHERE t.symbol = 'SR3Z3' or t.symbol = 'SR3H4';
执行计划:
┌─────────────┴─────────────┐ │ PARQUET_SCAN │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ symbol │ │ event_type │ │ side │ │ symbol_idx │ │ epoch │ │ price │ │ quantity │ │ msg_seq_num │ │ transact_time │ │ n_orders │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ EC: 14101941 │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ 14101941 │ │ (6.37s) │ └───────────────────────────┘
此场景下执行计划未显示任何过滤条件,扫描了全部14101941行数据,耗时6.37秒,说明DuckDB未执行谓词下推,而是做了全量扫描。
结论
这确实是DuckDB v0.10.2版本中Parquet谓词下推的局限性。该版本对OR连接的多值等值过滤场景,无法利用Parquet文件的min/max元数据来跳过不包含目标Symbol的分块。后续的DuckDB版本(如v0.11及以上)针对这类场景做了优化,支持将IN列表或OR连接的多值过滤条件下推到Parquet扫描层,实现分块跳过。
内容的提问来源于stack exchange,提问作者Phil Dawes
相关产品推荐
相关产品推荐

