【问题标题】:JOIN optimisation using partition key in clickhouse在 clickhouse 中使用分区键进行 JOIN 优化
【发布时间】: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 进行联接时,我希望发生以下情况。

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

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

【问题讨论】:

    标签: sql distributed-computing clickhouse


    【解决方案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
    猜你喜欢
    • 2021-03-26
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2019-08-17
    • 2019-11-22
    相关资源
    最近更新 更多