我有2个表A
和B
,它们都是MergeTree
,其中有8192个index_granularity
。
当我将cross join
应用于2个表时。一般来说,查询喜欢
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
绝对适合内存。
我的问题是:
为什么2个查询的性能差异很大? 2个表的顺序如何影响查询性能?选择订单时的一些建议。
同一查询在多次执行中管道可以不同吗?
更新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
答案 0 :(得分:2)