AggregatingMergeTree テーブルエンジン
このエンジンは MergeTree から継承しており、データパーツのマージロジックを変更します。ClickHouse は、同じ主キー (より正確には、同じソートキー) を持つすべての行を 1 行 (単一のデータパーツ内) にまとめ、その行に集約関数の状態を組み合わせて格納します。
AggregatingMergeTree テーブルは、集約済みmaterialized viewを含むインクリメンタルなデータ集約に使用できます。
以下の動画で、AggregatingMergeTree と集約関数の使用例を確認できます。
このエンジンは、次の型を持つすべてのカラムを処理します。
行数を桁違いに削減できる場合には、AggregatingMergeTree を使用するのが適切です。
テーブルを作成する
リクエストパラメータの説明は、リクエストの説明を参照してください。
クエリの句
AggregatingMergeTree テーブルを作成する場合、MergeTree テーブルを作成する場合と同じ 句 を指定する必要があります。
テーブル作成の非推奨の方法
新規プロジェクトではこの方法を使用しないでください。可能であれば、既存のプロジェクトも上で説明した方法へ移行してください。
すべてのパラメータの意味は MergeTree と同じです。
SELECT と INSERT
データを挿入するには、集約関数の -State バージョンを用いた INSERT SELECT クエリを使用します。
AggregatingMergeTree テーブルからデータを選択する場合は、GROUP BY 句と、挿入時と同じ集約関数を使用しますが、-Merge 接尾辞を付けて使用します。
SELECT クエリの結果において、AggregateFunction 型の値は、すべての ClickHouse 出力形式で実装依存のバイナリ表現になります。たとえば、SELECT クエリでデータを TabSeparated 形式にダンプした場合、このダンプは INSERT クエリを使用して再度ロードできます。
集約materialized viewの例
次の例では、test という名前のデータベースが既に存在すると仮定します。まだない場合は、以下のコマンドで作成してください。
次に、生データを格納するテーブル test.visits を作成します:
次に、訪問数の合計とユニークユーザー数を追跡する AggregationFunction を格納するための AggregatingMergeTree テーブルが必要です。
test.visits テーブルを監視し、AggregateFunction 型を使用する AggregatingMergeTree materialized viewを作成します。
test.visits からデータを取り込み、test.agg_visits を更新するmaterialized viewを作成します:
test.visits テーブルにデータを挿入します。`
データは test.visits と test.agg_visits の両方に挿入されます。
集約されたデータを取得するには、materialized view test.visits_mv に対して SELECT ... GROUP BY ... といったクエリを実行します。
test.visits にさらに 2 件のレコードを追加します。ただし、今回はそのうち 1 件には別のタイムスタンプを指定してみてください。
SELECT クエリを再度実行すると、次のような出力が返されます。
場合によっては、挿入時に行を事前集計せず、集計のコストを挿入時からマージ時へ移したいことがあります。通常は、エラーを避けるために、materialized view定義の GROUP BY
句に、集計の対象ではないカラムも含める必要があります。しかし、この動作を実現するには、optimize_on_insert = 0 (デフォルトで有効になっています) を設定したうえで、initializeAggregation
関数を利用できます。この場合、GROUP BY
を使用する必要はなくなります。
initializeAggregation を使用すると、グループ化を行わずに、個々の行ごとに集計状態が作成されます。
各元の行は materialized view に 1 行を生成し、実際の集計はその後 AggregatingMergeTree がパーツをマージするときに行われます。これは optimize_on_insert = 0 の場合にのみ当てはまります。
:::"