已开启
probe_inner #12
QLiangong创建于  5月22日
QLiangong
QLiangong成员
5月22日 创建

描述(Description)

Daft 的 probe_inner (hash join 核心探测函数) 存在性能优化空间。当前实现存在以下瓶颈:

  1. 迭代器开销probe_indices 返回嵌套迭代器,需要多层 enumerateflatten 操作
  2. 动态分发开销GrowableRecordBatch 使用 trait 对不同数据类型进行动态分发
  3. 逐元素 extend:每找到一个匹配行就调用一次 extend,当 fanout 较大时调用次数非常多

复现(Reproduction)

使用 TPC-H 基准测试评估 Daft hash join 性能:

测试用例 优化前(9654) 优化后(9654) 优化前(920B) 优化后(920B)
Q1 6.694 6.786 6.093 6.106
Q2 0.956 0.952 1.243 1.213
Q3 4.481 4.445 5.844 5.642
Q9 15.142 14.631 23.854 22.899
Q21 44.909 45.522 50.094 49.556
平台 优化前(s) 优化后(s) 变化幅度
9654 (AMD9654) 4.746 4.721 -0.53%
920B (鲲鹏ARM64) 6.145 5.973 -2.81%

跨平台性能比:0.7953 → 0.8052,提升约 1.24%

期望结果(Expected behavior)

优化 probe_inner 函数,减少迭代器开销和动态分发开销,提升 hash join 在各平台上的性能。

测试环境(Environment)

  • 操作系统及架构:Linux x86_64 (9654), Linux aarch64 (920B)
  • daft版本:v0.7.5
  • rust版本:nightly-2025-09-03

修复建议(Suggested Fix)

  1. 新增 probe_indices_vec 方法:将嵌套迭代器展开为扁平的三元组向量 (probe_idx, rb_idx, row_idx)
  2. 使用 take 批处理替代 extend 逐元素扩展:按 RecordBatch 分桶后一次性 take
  3. 自适应策略选择:根据 matches_lenfanout 判断使用 extend 还是 take

涉及文件:

  • src/daft-local-execution/src/join/inner_join.rs
  • src/daft-local-execution/src/join/anti_semi_join.rs
  • src/daft-local-execution/src/join/left_right_join.rs
  • src/daft-local-execution/src/join/outer_join.rs
  • src/daft-recordbatch/src/probeable/mod.rs
  • src/daft-recordbatch/src/probeable/probe_table.rs

严重程度(Severity)

  • 该优化提升 Daft hash join 的整体性能
  • 影响所有使用 hash join 的场景,TPC-H 基准测试显示跨平台性能比提升约 1.24%
likedislike
QLiangongQLiangong成员
5月22日 修改了issue 的描述
junlai-coder成员
5月22日 评论:

应该以软件性能优化的视角去提交issue,最终收益可以是体现ARM、X86各是多少,背景不应该是ARM和X86存在差距

likedislike
QLiangongQLiangong成员
5月22日 修改了issue 的描述
QLiangongQLiangong成员
5月22日 修改了issue 的描述
QLiangongQLiangong成员
5月22日 修改了issue 的描述
QLiangongQLiangong成员
5月25日 修改了issue 的描述