1. 什么是广播 Join在 Doris 中广播 JoinBroadcast Join是一种分布式表关联策略。其核心思想是将参与 Join 的其中一张小表维度表的数据完整地复制广播到所有包含另一张大表事实表数据分片的计算节点上然后在每个节点本地完成关联计算从而避免大表数据在节点间的网络传输。2. 广播 Join 的工作原理假设我们有两张表大表fact_table和小表dim_table。数据分布fact_table的数据通常按照分区键分散在多个 BEBackend节点上。广播阶段FEFrontend将dim_table的全量数据发送给每一个存有fact_table数据分片的 BE 节点。本地 Join每个 BE 节点在本地将自己持有的fact_table分片数据与接收到的完整dim_table数据进行关联运算。结果汇总各节点计算完成后将结果返回给 FE 进行汇总并返回给客户端。整个过程避免了fact_table数据的跨节点 Shuffle网络开销仅来自于小表的一次性广播。3. 广播 Join 的适用场景小表 Join 大表这是最典型的场景小表的数据量应足够小能够被每个 BE 节点的内存容纳。维度表查询常用于事实表与配置表、字典表等极小维度表的关联。避免数据倾斜当大表关联键存在严重数据倾斜导致 Shuffle Join 效率低下时广播 Join 可以规避此问题。查询性能要求高对于对延迟敏感的即席查询Ad-hoc Query广播 Join 能提供更稳定的性能。4. 如何在 Doris 中使用广播 Join4.1 通过 SQL Hint 指定可以在 SQL 中使用/* BROADCAST */Hint 来显式指定使用广播 Join。SELECT /* BROADCAST(dim) */ f.order_id, f.amount, d.city_name FROM fact_sales f JOIN dim_city d ON f.city_id d.city_id;上述 SQL 会强制将dim_city表广播出去。4.2 通过 Session 变量设置可以设置会话变量让优化器优先选择广播 Join。SET enable_broadcast_join true; -- 也可以设置广播表的大小阈值 SET broadcast_row_count_limit 1000000; -- 默认约100万行4.3 自动选择Doris 优化器会根据表的统计信息如行数、大小自动判断是否采用广播 Join。通常当系统估算小表的大小低于broadcast_row_count_limit阈值时会自动选择该策略。5. 广播 Join 的优缺点优点缺点避免大表Shuffle减少大量网络IO。计算本地化提高单个BE的计算效率。规避数据倾斜无需担心关联键分布不均。小表不能太大受限于单节点内存和网络带宽。广播开销如果小表较大广播本身会成为瓶颈。资源放大小表数据在集群中被复制多份占用额外内存。6. 最佳实践与调优建议准确统计信息确保 Doris 收集了最新的表统计信息以便优化器做出正确判断。合理设置阈值根据集群内存和网络状况调整broadcast_row_count_limit会话变量。监控内存使用广播 Join 会导致小表数据在多个 BE 上缓存需关注集群内存压力。与大表分区结合如果大表是分区表广播 Join 能与分区裁剪结合进一步提升性能。明确使用 Hint在明确知晓表大小且确定广播 Join 更优时使用 SQL Hint 来消除优化器的不确定性。7. 总结Doris 的广播 Join 是解决“小表 Join 大表”性能问题的利器。其核心优势在于将计算压力分散用一份小表数据的多份拷贝避免了海量大表数据的网络移动。开发者在实践中应重点关注小表的数据量并通过统计信息、Hint 和参数调优确保该策略在正确的场景下发挥最大效用。