SummingMergeTree テーブルのデータパーツをマージする際、ClickHouse が同じ主キー (より正確には、同じソートキー) を持つすべての行を、数値データ型のカラムの値を合計した 1 行に置き換える点です。ソートキーが、1 つのキー値に対して多数の行が対応するように構成されている場合、これによりストレージ容量が大幅に削減され、データの抽出も高速化されます。
このエンジンは MergeTree と組み合わせて使用することを推奨します。完全なデータは MergeTree テーブルに保存し、SummingMergeTree は、たとえばレポート作成時の集計データの保存に使用します。このような構成にすることで、不適切に構成された主キーによって貴重なデータが失われるのを防げます。
テーブルの作成
SummingMergeTree のパラメータ
カラム
columns - 値を合計する対象のカラム名を格納したタプルです。オプションのパラメータです。
カラムは数値型である必要があり、パーティションキーまたはソートキーに含まれていてはなりません。
columns が指定されていない場合、ClickHouse はソートキーに含まれていない、数値データ型のすべてのカラムの値を合計します。
クエリ句
SummingMergeTree テーブルの作成時には、MergeTree テーブルの作成時と同じ 句 が必要です。
使用例
sum と GROUP BY 句を使用します。
データ処理
GROUP BY 句を使用する必要があります。
合計に関する共通ルール
columns で定義されます。
合計対象のすべてのカラムの値が 0 の場合、その行は削除されます。
カラムが主キーに含まれず、かつ合計対象でない場合は、既存の値の中から任意の値が選択されます。
主キーに含まれるカラムの値は合計されません。
AggregateFunction カラムでの合計
ネストされた構造
Map で終わり、さらに次の条件を満たすカラムを少なくとも 2 つ含んでいる場合:
- 1 つ目のカラムが数値型
(*Int*, Date, DateTime)または文字列型(String, FixedString)で、これをkeyとします。 - それ以外のカラムが算術型
(*Int*, Float32/64)で、これを(values...)とします。
key => (values...) のマッピングとして解釈され、行のマージ時には、2 つのデータセットの要素が key ごとにマージされ、対応する (values...) は合計されます。
例:
Map の集計に sumMap(key, value) 関数を使用します。
ネストされたデータ構造では、集計用のカラムタプルにそのカラムを指定する必要はありません。
タプル 要素の集約
allow_tuple_element_aggregation 設定が有効な場合、Tuple カラムは再帰的にフラット化され、各末端要素が個別に合計対象となります。これにより、複数のメトリクスを 1 つの Tuple カラムに格納し、マージ時に要素ごとに合計できるようになります。
フラット化されたサブカラムにも、通常のカラムと同じルールが適用されます。
- 合計されるのは数値サブカラムのみです。
- ソートキーまたはパーティションキー内の
Tupleに属するサブカラムは、合計の対象から除外されます。 columnsが指定されている場合、列挙されたTupleカラムのサブカラムのみが合計されます。- 合計後に行内のすべての数値サブカラムが 0 になった場合、その行は削除されます。
この設定は変更不可であり、テーブル作成時に指定する必要があります。