clickhouse—交叉联接中表的顺序如何影响性能

8hhllhi2  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(445)

我有两张table A 以及 B ,两者都是 MergeTree 与8192 index_granularity . 当我申请的时候 cross join 两张table。一般来说,查询喜欢

select
    count(*)
from
(select * from A where ... )
cross join
(select * from B where ...)
where ...;

原始表格: A314307856 记录, B909470 .
过滤掉: A6599 记录, B14860 . (尽管有显著的记录差异,但两个过滤器都非常快)
我注意到在切换顺序时性能有很大的差距 A 以及 B 在查询中。
什么时候 A cross join B : 1 rows in set. Elapsed: 12.242 sec. Processed 26.72 million rows 什么时候 B cross join A : 1 rows in set. Elapsed: 45.584 sec. Processed 26.72 million rows 两个订单都有 pipeline ```
CreatingSets
Lazy
Expression
Expression
ParallelAggregating
Expression × (num_parts)
Filter
Expression
Expression
Expression
Filter
MergeTreeThread

有时, `B cross join A` 有

CreatingSets
Lazy
Expression
Expression
Aggregating
Concat
Expression
Filter
Expression
Limit
Expression
Union
Limit × 7
Expression
Filter
MergeTreeThread

-->我注意到 `clickhouse-server` 我的记忆会随着这条管道很快迸发出来。
据我所知 `join` 查询, `clickhouse` 将首先执行右边的执行,将其放入内存中,然后执行左边的下一个。在我的情况下,两者都过滤掉了 `A` 以及 `B` 绝对符合记忆。
我的问题是:
为什么两个查询的性能有巨大的差异?两个表的顺序如何影响查询性能?选择顺序时的一些建议。
在多个执行中,同一查询的管道是否可以不同?
更新1:有关我的查询的更多详细信息

SELECT
count(*)
FROM
(
SELECT
...
FROM B
WHERE (((day >= '2018-08-15') AND (day <= '2018-08-16')) AND ((timestamp >= 1534310226442) AND (timestamp <= 1534399065648))) AND (log_time <= 1534316318187)
)
CROSS JOIN
(
SELECT
...
FROM A
WHERE (((day >= '2018-08-14') AND (day <= '2018-08-16')) AND ((timestamp >= 1534223826442) AND (timestamp <= 1534399065648))) AND (log_time <= 1534316318187) AND match(..., '...')
)
WHERE position(..., ...) > 1

nnt7mjpx

nnt7mjpx1#

目前clickhouse还没有一个基于成本的优化器来自动交换表,如果这是实现相同结果的更有利的方法的话。这种差异首先存在的原因有很多,比如更好的处理器缓存利用率,或者在丢弃之前做额外的工作。性能自省功能目前正在被合并到clickhouse master中,并将在即将发布的版本中提供,因为现在深入挖掘主要局限于普通的linux工具集,如perf/strace/dstat/等。作为建议,您通过测量什么最适合您的情况,做了绝对正确的事情,不要盲目相信任何人的建议。
clickhouse或多或少是确定性的,所以它不应该随着固定查询而改变。你能提供一个复制这个的方法吗?

相关问题