在 ClickHouse、JOIN 与重复信息中查询此信息的最佳方式
Posted
技术标签:
【中文标题】在 ClickHouse、JOIN 与重复信息中查询此信息的最佳方式【英文标题】:Best way to query this information in ClickHouse, JOIN vs duplicated information 【发布时间】: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 条记录,而另一个表将接收同样多的信息。
谢谢。
【问题讨论】:
【参考方案1】:我会将所有数据保存在一个表中,然后使用 AggregatingMergeTree/CollapsingMergeTree 引擎和/或聚合函数,如 argMin/argMax 或 sequenceMatch。
我会避免 JOIN,因为它们的成本很高,重复似乎是 OLAP 案例的最佳解决方案。
【讨论】:
以上是关于在 ClickHouse、JOIN 与重复信息中查询此信息的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
大数据ClickHouse进阶:ClickHouse的Join子句
clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化(代码
ClickHouse 引擎在行为分析场景下的 JOIN 优化