如何在ClickHouse数据库中加速JOIN表格?

7
我有两个表格
事件 (event)
- id - 操作系统 (os)
参数 (params)
- id - x轴 (sx) - y轴 (sy)
这两个表通过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中有效地使用连接操作?将所有数据保留在一个表中并不方便。

2个回答

5

我在连接两个巨大的分布式表时遇到了同样的问题,主要有两个问题:

  • 执行时间太长
  • 查询需要的内存限制。

对我有效的方法是通过 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。


3
您可以将查询重写为以下方式:
select count(*)
from event 
where os like 'Android%' 
AND id IN (select id from params where sx >= 1024)

如果所有数据都在一个表中 - 16 秒,如果使用子查询 - 78 秒。 - Oleg Khamov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接