我有两张table A
以及 B
,两者都是 MergeTree
与8192 index_granularity
. 当我申请的时候 cross join
两张table。一般来说,查询喜欢
select
count(*)
from
(select * from A where ... )
cross join
(select * from B where ...)
where ...;
原始表格: A
有 314307856
记录, B
有 909470
.
过滤掉: A
有 6599
记录, B
有 14860
. (尽管有显著的记录差异,但两个过滤器都非常快)
我注意到在切换顺序时性能有很大的差距 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
1条答案
按热度按时间nnt7mjpx1#
目前clickhouse还没有一个基于成本的优化器来自动交换表,如果这是实现相同结果的更有利的方法的话。这种差异首先存在的原因有很多,比如更好的处理器缓存利用率,或者在丢弃之前做额外的工作。性能自省功能目前正在被合并到clickhouse master中,并将在即将发布的版本中提供,因为现在深入挖掘主要局限于普通的linux工具集,如perf/strace/dstat/等。作为建议,您通过测量什么最适合您的情况,做了绝对正确的事情,不要盲目相信任何人的建议。
clickhouse或多或少是确定性的,所以它不应该随着固定查询而改变。你能提供一个复制这个的方法吗?