在 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 优化的主要内容,如果未能解决你的问题,请参考以下文章