功能概述
功能开关
主开关:tdsql_enable_parallel_hash_join
·会话级开关,默认关闭。开启后,并行 Hash Join 默认选择本地 Worker 执行
·开启后,表示允许优化器为合适的 JOIN 选择并行 Hash Join
·开启后并不代表所有 JOIN 都一定会使用该能力,最终仍由优化器按代价选择
·可选调优方式:如需进一步控制并行度或分发方式,可结合 PARALLEL()、PQ_DISTRIBUTE() hint 做验证和调优
计划形态
并行 Hash Join 常见的计划形态如下:
·Shared hash
·多个 worker 共同构建并探测一份共享哈希表
·常见于两侧都具备较好并行扫描收益的场景
EXPLAIN FORMAT=tree SELECT /*+ PARALLEL(t1) PARALLEL(t2) */ * FROM t1 LEFT JOIN t2 ON t1.a = t2.a;EXPLAIN-> Gather (slice: 1, workers: 4) (cost=*** rows=***) -> Left hash join (t2.a = t1.a) (cost=*** rows=***) -> Table scan on t1, with range parallel scan (cost=*** rows=***) -> Shared hash -> Table scan on t2, with range parallel scan (cost=*** rows=***)
性能收益
·提升大表 Join 吞吐:build/probe 可并行执行,更充分利用多核 CPU 能力
·提升扫描型分析 SQL 性能:对大表扫描、索引收益不明显、需要处理较多连接数据的场景收益更明显
·降低单线程热点:将连接阶段的处理压力分摊到多个 worker,缩短大查询执行时间
·自动选择更优执行方式:优化器会在 Shared hash、Gather + Hash 等候选方案间做代价比较,自动选择更优计划
·预期说明:对小表、返回行数较少、或已有高效索引的场景,性能收益可能不明显
使用建议
·建议按会话开启验证 SET SESSION tdsql_enable_parallel_hash_join = ON;
·单条 SQL 通过 HInt set_var(tdsql_enable_parallel_hash_join=on)开启