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