在ClickHouse,JOIN和重复信息中查询此信息的最佳方式

时间:2017-09-13 11:52:52

标签: sql clickhouse

我有以下问题。

我需要记录很多信息,而不是分组和过滤在很多方面。 该信息碰巧有步骤,让我们想象它有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等) - > 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和group by country_id有多少步骤1,步骤2,步骤3,步骤4以及每个步骤可能具有的其他标志。 / p>

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

让我们考虑step1表每天会收到大约100kk的记录,而另一张表会收到尽可能多的信息。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

我会避免使用JOIN,因为它们花费了很多,重复似乎是OLAP案例的最佳解决方案。