【发布时间】: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