我有两张桌子
事件
PARAMS
此表与id的关系为1-1。如果执行查询
select count(*)
from
(select id from event where os like 'Android%')
inner join
(select id from params where sx >= 1024)
using id
他们很慢
但如果所有数据都包含在一个表中
select count(*) from event where sx >= 1024 and os like 'Android%'
查询执行得非常快。
请告诉我如何在ClickHouse DB中使用加入有效?将所有数据保存在一个表中是不方便的。
答案 0 :(得分:2)
您可以像这样重写查询:
select count(*)
from event
where os like 'Android%'
AND id IN (select id from params where sx >= 1024)
答案 1 :(得分:0)
加入2个巨大的分布式表时,我遇到同样的问题。 有两个主要问题
对我有用的是通过id%N
使用子查询对计算查询进行分片,然后合并所有结果。
SELECT count(*)
FROM
(
SELECT 1
FROM event
WHERE id%2=0 AND id IN
(
SELECT id
FROM params
WHERE id % 2 = 0 AND sx >= 1024
)
UNION ALL
SELECT 2
FROM event
WHERE id % 2 = 1 AND id IN
(
SELECT id
FROM params
WHERE id % 2 = 1 AND sx >= 1024
)
)
您可以更改id%N
(示例中为2),直到获得所需的性能为止。
如果将分布式引擎用于表,则需要将IN替换为GLOBAL IN。