在 clickhouse 中使用分区键进行 JOIN 优化

Posted

技术标签:

【中文标题】在 clickhouse 中使用分区键进行 JOIN 优化【英文标题】:JOIN optimisation using partition key in clickhouse 【发布时间】:2021-09-02 16:33:44 【问题描述】:

我正在寻找类似于 clickhouse 中的亲和力托管的功能 - https://ignite.apache.org/docs/latest/data-modeling/affinity-collocation

基本上,我有 2 个不同的表,我们称之为员工和出勤

员工表

ID   Name
-    -
1    Sankar
2    VM
3    Amal

考勤表

Employee_ID   Date.       isPresent    
-             -           -
1             1/1/2020    True
2             1/1/2020    False
3             1/1/2020    True

现在让两棵树都是 MergeTree,我使用 ID 和 Employee_ID 作为分区键。 这样可以确保两个表中同一员工的记录总是在同一个节点上结束。它不会转到不同的表。

现在,当我根据 ID 和 Employee_ID 进行联接时,我希望发生以下情况。

    转到每个节点 在两个本地表上运行连接 从每个节点获取结果并进一步减少它们以获得最终结果。

我尝试了全局和本地分布式 JOIN,似乎他们并没有完全使用它。 请就如何实现这一目标提出建议

【问题讨论】:

【参考方案1】:

使用 ID 和 Employee_ID 作为分区键

你的意思是分片键?


所以你有 4 个表:Employee_local、Employee、Attendance_local、Attendance

进行本地连接的最简单方法是对正确的表使用 _local。

from Employee join Attendance_local on ...

另一种选择是

set distributed_product_mode='local';

from Employee join (select * frin Attendance) on ...

此设置仅与子查询有关。

【讨论】:

我试过上面的。上面所做的是,它在所有存在 Attendance_LOCAL 的节点上运行“select * from Attendance_LOCAL”,合并结果,然后运行“from Employee_LOCAL join (Take data from _subquery)”。我想要的是在每个节点上运行 Employee_LOCAL 和 Attendance_LOCAL 并合并最终结果。更像是地图减少 看来distributed_product_mode='local' 现在坏了github.com/ClickHouse/ClickHouse/issues/25809

以上是关于在 clickhouse 中使用分区键进行 JOIN 优化的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse重复数据处理

功能与 clickhouse 中的滞后分区相同

Clickhouse一级索引优化方案

Clickhouse一级索引优化方案

clickhouse-FREEZE分区操作

如何允许Joi中的任何其他键[重复]