【问题标题】:Partial merge join behavior if the right table is already sorted according to the join key如果右表已根据连接键排序,则部分合并连接行为
【发布时间】:2021-09-14 17:44:50
【问题描述】:

我正在为下面描述的用例评估不同的连接算法,并在文档中寻找说明。 在解释部分合并连接算法时,文档提到:

First ClickHouse 通过块中的连接键对右表进行排序,并 为已排序的块创建 min-max 索引。然后它对左边的部分进行排序 通过连接键连接表并将它们连接到右表。最小-最大指数 也用于跳过不需要的右表块。

这是有道理的,但是如果左右表都已经根据连接键在磁盘上排序了怎么办? Clickhouse 是否仍会再次对正确的表进行排序并以相同的顺序将其转储到磁盘上?如果是,这是一种预期的行为吗?

具体用例: 左表:

CREATE TABLE default.spans (
    `project_id` UInt64, 
    `transaction_span_id` UInt64, 
    `transaction_name` LowCardinality(String), 
    `span_id` UInt64, 
    `transaction_finish_ts` DateTime, 
    `deleted` UInt8,
    `retention_days` UInt16,
    ... MANY MORE COLUMNS ....
) ENGINE = ReplacingMergeTree(deleted) 
PARTITION BY toMonday(transaction_finish_ts) 
ORDER BY (
    project_id, 
    toStartOfDay(transaction_finish_ts), 
    transaction_name, 
    cityHash64(transaction_span_id),
    cityHash64(span_id),
) 
TTL transaction_finish_ts + toIntervalDay(retention_days) 

右表:

CREATE TABLE default.transactions_local (
    `project_id` UInt64, 
    `span_id` UInt64, 
    `transaction_name` LowCardinality(String), 
    `finish_ts` DateTime, 
    `retention_days` UInt16, 
    `deleted` UInt8, 
    ... A LOT MORE COLUMNS ...
) ENGINE = ReplacingMergeTree(deleted) 
PARTITION BY (retention_days, toMonday(finish_ts)) 
ORDER BY (
    project_id, 
    toStartOfDay(finish_ts), 
    transaction_name, 
    cityHash64(span_id)
) 
TTL finish_ts + toIntervalDay(retention_days) 

加入键:

spans.project_id = transact.project_id AND 
toStartOfDay(spans.transaction_finish_ts) = toStartOfDay(transact.finish_ts) AND
spans.transaction_name = transact.transaction_name AND
cityHash64(spans.transaction_span_id) = cityHash64(transact.span_id)

连接将是 n:1,左表的 n 条记录对应于右表之一。

所以连接键中的四个条件是两个表的 ORDER BY 子句中相同的第一个字段。 这意味着不需要对所有表进行重新排序。

(一周前作为问题被问到here

谢谢, 菲利波

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    这是有道理的,但如果左派和 右表已经根据连接键在磁盘上排序了吗?

    Clickhouse 不使用表格的顺序和表格的索引。

    这意味着不需要重新排序任何表。

    没关系。 CH 无法使用。与当前的查询管道一起使用有点不可能。

    近期没有改进连接(实现合并连接)的计划,因为它们不适合当前架构。

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      相关资源
      最近更新 更多