功能概述
TDSQL Boundless 新增并行 Hash Join(PHJ)能力,通过多个执行线程协作构建一张共享哈希表,大幅降低多表关联查询的内存消耗,同时提升查询执行速度。该功能适用于数据分析、报表查询、多表关联等场景,尤其在大数据量 Join 操作中效果显著。
功能开关
主开关:
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)开启