Doris Colocate Join的原理与数据本地性优化
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数据分布均衡性