CodeWalk

Doris Colocate Join的原理与数据本地性优化

作者:Yahuda · 2026-05-30 12:55

Doris的Colocate Join(Colocation Join)如何通过数据本地性避免Shuffle?请解释Colocate Group的创建方式、分桶一致性的要求、以及Colocate Join在实时大宽表场景下的性能优势。与普通分布式Join相比,Colocate Join在查询计划和数据分布上有什么区别?

回答

Yahuda

Doris Colocate Join原理:

1. 核心思想:将Join相关的表按相同方式分桶(相同分桶数+相同分桶列),使Join Key相同的数据分布在同一个BE节点上,实现本地Join,消除网络Shuffle。

2. Colocate Group建表

-- 设置Colocate Group
CREATE TABLE orders (
  order_id BIGINT,
  user_id INT,
  amount DOUBLE
) DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES (
  'colocate_with' = 'group1'
);

CREATE TABLE users (
  user_id INT,
  name STRING,
  level INT
) DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES (
  'colocate_with' = 'group1'
);

3. Colocate Join前提条件

  • 同一Colocate Group内的表分桶数必须相同
  • 分桶列(DISTRIBUTED BY HASH列)必须相同
  • 副本数必须相同
  • 表引擎(Engine类型)必须相同

4. 执行计划对比

普通Join

表A(分桶10) ═══ Shuffle ═══ 表B(分桶10)
              → 跨BE网络传输

Colocate Join

表A(分桶10) ═══ 本地Join ═══ 表B(分桶10)
              → 无网络传输

5. 性能对比: | 场景 | 普通Join | Colocate Join | |------|----------|---------------| | 数据量 | 1TB+1TB | 1TB+1TB | | Shuffle数据量 | ~1TB(网络传输) | 0 | | 查询耗时(参考) | 60s | 15s |

6. 注意事项

  • Colocate Group内的表增删节点后需重新平衡数据
  • 使用SHOW PROC '/colocation'查看Colocate状态
  • 违反条件时自动退化为普通Join(查询仍可执行)
  • 大批量数据导入可能影响Colocate数据分布均衡性