我有两张桌子
事件
参数
该表通过 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
Run Code Online (Sandbox Code Playgroud)
他们很慢
但是如果所有数据都包含在一张表中
select count(*) from event where sx >= 1024 and os like 'Android%'
Run Code Online (Sandbox Code Playgroud)
查询执行得非常快。
请告诉我如何在 ClickHouse DB 中使用 join 有效?将所有数据放在一张表中并不方便。
我在连接两个巨大的分布式表时遇到了同样的问题。主要有两个问题
对我有用的是使用子查询按 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
)
)
Run Code Online (Sandbox Code Playgroud)
您可以更改 id%N(示例中为 2),直到获得所需的性能。如果您对表使用分布式引擎,则需要将 IN 替换为 GLOBAL IN。
您可以像这样重写查询:
select count(*)
from event
where os like 'Android%'
AND id IN (select id from params where sx >= 1024)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10784 次 |
| 最近记录: |