1

我有以下问题。

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

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

所以一个例子就是。

Step1 (transaction_id, date, country_id, device_id, browser_id, ip, language_id, target_id, etc) -> 40kk records

Step2 (transaction_id, date, country_id, device_id, browser_id, ip, language_id, target_id, step2_date, step2_ip, etc) -> 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, etc) -> 1kk 记录

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

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

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

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

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

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

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

谢谢你。

4

1 回答 1

0

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

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

于 2017-09-13T22:47:21.670 回答