【问题标题】:How make JOIN table in ClickHouse DB faster?如何使 ClickHouse DB 中的 JOIN 表更快?
【发布时间】:2017-03-15 18:22:23
【问题描述】:

我有两张桌子

事件

  • 身份证
  • 操作系统

参数

  • 身份证
  • 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 有效?将所有数据保存在一张表中很不方便。

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    我在加入 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。

    【讨论】:

      【解决方案2】:

      你可以像这样重写查询:

      select count(*)
      from event 
      where os like 'Android%' 
      AND id IN (select id from params where sx >= 1024)
      

      【讨论】:

      • 如果一个表中的所有数据 - 16 秒,如果我使用子查询 - 78 秒
      猜你喜欢
      • 2021-03-26
      • 2010-12-21
      • 2020-05-06
      • 2020-05-15
      • 2020-11-17
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多