7

我有两张桌子

事件

  • ID
  • 操作系统

参数

  • ID
  • sx
  • 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 中使用 join 有效?将所有数据保存在一张表中并不方便。

4

2 回答 2

4

我在加入 2 个巨大的分布式表时遇到了同样的问题。有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。

于 2018-08-18T03:28:56.980 回答
3

您可以像这样重写查询:

select count(*)
from event 
where os like 'Android%' 
AND id IN (select id from params where sx >= 1024)
于 2016-11-03T20:19:14.977 回答