2017-09-13 445 views
0

我遇到以下問題。在ClickHouse,JOIN中查詢此信息的最佳方法vs重複信息

我需要記錄很多信息,而不是以多種方式進行組合和過濾。 這些信息恰巧有這樣的步驟,讓我們想象它有4個步驟,其中每一步添加更多信息到上一步。

目前,我有4個表格,每一步的每一步,每一步的所有信息和前一個。

所以一個例子是。

第一步(TRANSACTION_ID,日期,COUNTRY_ID,DEVICE_ID,browser_id,IP,LANGUAGE_ID,target_id等) - > 40kk記錄

第二步(TRANSACTION_ID,日期,COUNTRY_ID,DEVICE_ID,browser_id,IP,LANGUAGE_ID,target_id, step2_date,step2_ip等) - > 35kk記錄

第三步(TRANSACTION_ID,日期,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,step 2_date,step2_ip,step3_date,step3_ip,time_taken,step4_date,step4_ip,final_value等) - > 1kk記錄

正如您在示例中看到的,每個步驟都包含所有以前的數據和新的字段。

理想的做法是先將所有初始數據(當前大約有50個字段)和其他步驟與每個步驟的附加數據進行第一步,然後通過transaction_id加入JOIN並能夠GROUP和過濾。

我試過這種方法,但是因爲它必須對每個條目進行迭代才能匹配其他步驟中的事務,所以它看起來不太理想。 (查詢時間大約需要3秒,而另一方面需要大約0.1秒)

另一方面,擁有每個表中所有可用信息,允許我過濾UNION或JOIN之前的數據,這是相當快,但我需要在每一步複製數據..

我需要從4個步驟查詢一個SELECT,這將告訴我例如一個特定的日期和device_id和group_ country_id多少個step1,步驟2,步驟3,步驟4以及每個步驟可能具有的其他標誌。

因此,問題是如果有其他方法來加快步驟之間的關係,以避免在每個步驟中重複信息並保持速度? 也許一種方法來索引transaction_id(這是唯一的,並在第一步中生成)

讓我們考慮一下step1表會每天接收約100kk的記錄,而另一個則獲得儘可能多的信息。

謝謝。

回答

0

我會保留所有數據在一個表中,然後使用AggregatingMergeTree/CollapsingMergeTree引擎和/或聚合函數,如argMin/argMax或sequenceMatch。

我會避免JOINs,因爲它們花費很多,重複似乎是OLAP情況下的最佳解決方案。