首页/数据/数仓建模速查/OLAP join 策略:广播、分桶与倾斜
湖仓与引擎63 条

OLAP join 策略:广播、分桶与倾斜

引擎根据表大小选择广播或 shuffle join;等值 join 可使用分桶对齐避免 shuffle;倾斜 key 需要单独处理,否则节点负载不均。

数仓建模速查数据更新于 2026-10-13

连接策略怎么被选中

同一个 join 在不同数据规模下有完全不同的最优执行方式:一侧数据很小时广播过去最省事,两侧都大时按 key 重分布才现实,两表分桶一致时还能省掉重分布。引擎的优化器根据统计信息和表结构做判断,判断依据错,选出的计划就会差出几倍。

基本信息

广播连接小表复制到各节点,避免重分布
重分布连接两侧按 key 打散,网络开销大
分桶对齐连接桶数与连接键一致时可省去重分布
决策依据统计信息、表大小、分桶与排序键
查看方式EXPLAIN 查看实际选用的策略

典型使用场景

  • 事实表关小维表:广播维表最省开销
  • 两张事实表互连:按 key 重分布,靠统计信息找较小的先传入
  • 周期性固定关联:预先按连接键分桶,把重分布成本摊到建表阶段
  • 存在超大 key:连接前先对倾斜键单独处理
  • 计划异常排查:对比 EXPLAIN 中估算行数与实际行数,判断统计是否可信

查看执行计划

查看执行计划
-- 先在 EXPLAIN 里确认连接方式与估算行数
EXPLAIN
SELECT o.store_id, count(1) AS order_cnt
FROM dwd_trade_order_di o
JOIN dim_store s ON o.store_id = s.store_id
WHERE o.dt = '2026-10-12'
GROUP BY o.store_id;
-- 估算行数与实际差得多时,先补统计信息再谈调参

策略对照

策略适用条件主要代价
广播连接一侧远小于另一侧每节点内存占用
重分布连接两侧都大网络传输与落盘
分桶对齐连接两表桶数与键一致建表结构约束
加盐分散存在超大倾斜 key额外计算与代码复杂度
预先聚合连接只为取汇总值需要额外的汇总表

倾斜比策略更常见

实际链路里让 join 变慢的往往不是策略选错,而是某个 key 的数据量占到总量的一大半:无论广播还是重分布,这个 key 都落在一个节点上,其余节点早早跑完等着。识别方式是看各任务处理行数的分布,差出几个数量级就基本可以确认。处理手段包括单独拆出倾斜 key 再合并结果。

分桶对齐连接的效果依赖两侧桶数一致。任何一侧调整桶数都会让已建好的连接失效并退化为重分布,因此改桶数属于结构性变更,需要评估下游影响。
把广播阈值调大以解决单个慢任务,会让优化器把本不该广播的表也广播出去,执行节点内存压力上升,集群里其他任务跟着受影响。

易错点

  • 广播阈值调大后维表撑爆执行节点内存,任务长时间卡住不报错
  • 一侧改桶数后分桶连接失效,全部退化为重分布,耗时成倍上升
  • 忽略数据倾斜,只反复调整连接策略,慢任务始终集中在同一个节点
  • 统计信息长期不更新,优化器按错误的行数估算选择连接方式

数据来源与参考

  • Apache Doris 官方文档:Runtime Filter
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌