【问题标题】:Best way to query this information in ClickHouse, JOIN vs duplicated information在 ClickHouse、JOIN 与重复信息中查询此信息的最佳方式
【发布时间】:2017-09-13 11:52:51
【问题描述】:

我有以下问题。

我需要记录很多信息,而不能以多种方式进行分组和过滤。 该信息恰好有步骤,因此,假设它有 4 个步骤,其中每个步骤都会为上一步添加更多信息。

目前我有 4 个表,每个步骤一个,包含每个步骤和上一个步骤的所有信息。

举个例子吧。

Step1 (transaction_id, date, country_id, device_id, browser_id, ip, language_id, target_id等) -> 40kk条记录

Step2 (transaction_id, date, country_id, device_id, browser_id, ip, language_id, target_id, step2_date, step2_ip 等) -> 35kk 条记录

Step3 (transaction_id, date, country_id, device_id, browser_id, ip, language_id, target_id, step2_date, step2_ip, step3_date, step3_ip, time_taken, etc) -> 5kk条记录

Step4 (transaction_id, date, country_id, device_id, browser_id, ip, language_id, target_id, step2_date, step2_ip, step3_date, step3_ip, time_taken, step4_date, step4_ip, final_value等) -> 1kk条记录

正如您在示例中看到的,每个步骤都包含所有以前的数据以及新字段。

理想的情况是第一步包含所有初始数据(目前约为 50 个字段),其他步骤包含每个步骤的附加数据,然后通过 transaction_id 加入并能够进行 GROUP 和 FILTER .

我尝试了这种方法,但由于它必须对每个条目进行迭代以匹配其他步骤中的事务,因此它似乎不太理想。 (查询大约需要 3 秒,而其他方式大约需要 0.1 秒)

另一方面,拥有每个表中的所有可用信息,允许我过滤 UNION 或 JOIN 之前的数据,并且速度相当快,但我需要在每个步骤中复制数据..

我需要从 4 个步骤中查询一个 SELECT,它会告诉我例如特定日期和 device_id 以及按 country_id 分组的步骤 1、步骤 2、步骤 3、步骤 4 以及每个步骤可能具有的其他标志。

那么,问题是是否有任何其他方法可以加快步骤之间的关系,从而避免每个步骤中的信息重复并保持速度? 也许是一种索引 transaction_id 的方法(这是唯一的并且在第一步中生成)

让我们考虑一下 step1 表每天将接收大约 100 kk 条记录,而另一个表将接收同样多的信息。

谢谢。

【问题讨论】:

    标签: sql clickhouse


    【解决方案1】:

    我会将所有数据保存在一个表中,然后使用 AggregatingMergeTree/CollapsingMergeTree 引擎和/或聚合函数,如 argMin/argMax 或 sequenceMatch。

    我会避免 JOIN,因为它们的成本很高,重复似乎是 OLAP 案例的最佳解决方案。

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多