2017-09-13 8 views
0

私は以下の問題があります。ClickHouse、JOINと複製情報のこの情報を照会する最良の方法

多くの情報をグループ化してフィルタリングする方法よりも多くの情報を記録する必要があります。 その情報にはステップがあるので、4ステップがあると想像してみましょう。各ステップで前のステップに情報を追加します。

現在、私は4つのテーブルを持っています。各ステップごとに1つずつ、各ステップの情報と前のテーブルがあります。

例があります。

ステップ1(TRANSACTION_ID、日付、COUNTRY_ID、DEVICE_ID、browser_id、IP、LANGUAGE_ID、TARGET_ID、など) - > 40kk記録

ステップ2(TRANSACTION_ID、日付、COUNTRY_ID、DEVICE_ID、browser_id、IP、LANGUAGE_ID、TARGET_ID、 step2_date、step2_ip、など) - > 35kk記録

ステップ3(TRANSACTION_ID、日付、COUNTRY_ID、DEVICE_ID、browser_id、IP、LANGUAGE_ID、TARGET_ID、step2_date、step2_ip、step3_date、step3_ip、TIME_TAKEN、など) - > 5kk記録

ステップ4(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でジョインしてGROUPおよびフィルタ。

私はこのアプローチを試みましたが、他のステップでトランザクションと一致するすべてのエントリを繰り返し処理する必要があったため、最適ではありませんでした。 (他の方法で約0.1秒かかったので、クエリに約3秒かかりました)

一方、各テーブルに利用可能なすべての情報があるので、UNIONまたはJOINより前のデータをフィルタリングできます。それは非常に高速ですが、私は各ステップでデータを複製する必要があります。

私は特定の日付とdevice_idとcountry_idでグループ化する例を教えてくれる4つのステップから1つのSELECTをクエリする必要がありますstep1、 step2、step3、step4、および各ステップが持つ可能性のある他のフラグがあります。

したがって、それぞれの情報の重複を避けるために、ステップ間の関係をスピードアップする他の方法があれば問題になります。 transaction_idのインデックスを作成する方法(最初の手順で一意で生成されたもの)

step1テーブルでは、1日あたり約100kkのレコードと多くの情報を受け取ることができます。

ありがとうございます。

答えて

0

すべてのデータを1つのテーブルに保存し、AggregatingMergeTree/CollapsingMergeTreeエンジンやargMin/argMaxやsequenceMatchなどの集計関数を使用します。

私はJOINを避けることになります。なぜなら、OLAPの場合、重複が最適な解決策であるようです。

関連する問題