Folia
← 返回头版

DuckDB中Parquet文件分页查询:file_row_number优于OFFSET

在DuckDB中处理大型Parquet文件时,选择合适的分页方法至关重要。一项测试分析发现,使用file_row_number按行范围查询相比传统的LIMIT/OFFSET方法性能明显更优,且后者存在严重的数据完整性风险。1

在包含163行组、共2000万行的Parquet文件上,file_row_number方法的查询速度快2.53倍,这一优势在全部37次运行中保持一致。1更令人担忧的是,OFFSET在关闭插入顺序保存并启用多线程并发的条件下,会导致约30%的数据出现错误——包括600万行数据缺失和500万行数据重复。1这类错误容易被忽视,因为行计数检测无法发现问题所在:缺失行与重复行相互抵消,总行数仍保持在2000万行。1

DuckDB优化器在处理此类问题时存在阈值限制。当LIMIT不超过100万时,优化器会自动将OFFSET查询改写为基于行号的查询;超过此阈值则执行完全文件扫描。1值得注意的是,在单行组Parquet文件中,file_row_number仅快1.25倍,性能收益主要源于多行组场景的优化。1为确保分页导出的数据完整性,建议使用crypto_hash_agg('blake3', hash())进行验证。1


评论