SummingMergeTree
このエンジンはMergeTreeから継承されています。違いは、SummingMergeTree
テーブルのデータパーツをマージする際に、ClickHouseが同じ主キー(正確には同じソーティングキー)を持つすべての行を、数値データ型のカラムの集計値を含む1行に置き換えることです。ソーティングキーが1つのキー値に対して多数の行に対応するように構成されている場合、ストレージ容量が大幅に削減され、データの選択速度が向上します。
このエンジンはMergeTree
と組み合わせて使用することをお勧めします。完全なデータをMergeTree
テーブルに保存し、集約データの保存にSummingMergeTree
を使用します。例えば、レポートを準備するときなどです。このアプローチにより、誤って構成された主キーによって貴重なデータを失うことを防ぎます。
テーブルの作成
リクエストパラメータの説明については、リクエストの説明を参照してください。
SummingMergeTreeのパラメータ
columns
columns
- 値を集計するカラムの名前を持つタプル。オプションのパラメータです。
カラムは数値型でなければならず、主キーには含まれてはいけません。
columns
が指定されていない場合、ClickHouseは主キーにない数値データ型の全カラムの値を集計します。
クエリ句
SummingMergeTree
テーブルを作成する際には、MergeTree
テーブルを作成する際と同様に、同じ句が必要です。
非推奨のテーブル作成方法
新しいプロジェクトではこの方法を使用しないでください。可能な場合は、古いプロジェクトを上記の方法に切り替えてください。
columns
を除くすべてのパラメータはMergeTree
と同じ意味を持ちます。
columns
— 値を集計するカラムの名前を持つタプル。オプションのパラメータです。詳細については、上記のテキストを参照してください。
使用例
次のテーブルを考えます:
データを挿入します:
ClickHouseはすべての行を完全に合計しない可能性があります(下記を参照)。そのため、クエリで集約関数sum
とGROUP BY
句を使用します。
データの処理
データがテーブルに挿入されると、それらはそのまま保存されます。ClickHouseは定期的に挿入されたデータパーツをマージし、このとき同じ主キーを持つ行が合計され、データの各部分に対して1つの行に置き換えられます。
ClickHouseはデータパーツをマージすることができるため、異なるデータ部分が同じ主キーを持つ行で構成されることがあり、つまり合計が不完全になる可能性があります。したがって、クエリでは集約関数sum()とGROUP BY
句を使用する必要があります。
合計に関する一般的なルール
数値データ型のカラムの値が合計されます。カラムの集合はパラメータcolumns
で定義されます。
合計のための全てのカラムの値が0だった場合、その行は削除されます。
カラムが主キーに含まれておらず、また集計されていない場合は、既存の値から任意の値が選択されます。
主キーのカラムについては、値は集計されません。
集約関数カラムにおける合計
AggregateFunction 型のカラムについて、ClickHouseはAggregatingMergeTreeエンジンのように、その関数に基づいて集約を行います。
ネストされた構造
テーブルは特別な方法で処理されるネストされたデータ構造を持つことができます。
ネストされたテーブルの名前がMap
で終わり、以下の条件を満たす少なくとも2つのカラムを含む場合:
- 最初のカラムは数値(
(*Int*, Date, DateTime)
)または文字列((String, FixedString)
)であり、これをkey
と呼び、 - その他のカラムは算術的なものである(
(*Int*, Float32/64)
)とし、これを(values...)
と呼ぶ場合、
このネストされたテーブルはkey => (values...)
のマッピングとして解釈され、行をマージするときに、2つのデータセットの要素がkey
によってマージされ、対応する(values...)
が合計されます。
例:
データを要求する際は、Map
の集約にはsumMap(key, value)関数を使用してください。
ネストされたデータ構造の場合、集計用のカラムのタプルにそのカラムを指定する必要はありません。