プロジェクション
プロジェクションは、クエリ実行を最適化する形式でデータを保存します。この機能は次のような用途に有効です:
- プライマリキーに含まれていないカラムに対してクエリを実行する場合
- カラムを事前集約する場合。計算量と I/O の両方を削減できます
テーブルに対して 1 つ以上のプロジェクションを定義できます。クエリ解析時には、ユーザーが指定したクエリを変更することなく、スキャンするデータ量が最も少ないプロジェクションが ClickHouse によって自動的に選択されます。
プロジェクションは内部的に新しい非表示テーブルを作成します。そのため、より多くの I/O とディスク容量が必要になります。 たとえば、プロジェクションで異なるプライマリキーを定義した場合、元のテーブルのすべてのデータが複製されます。
プロジェクションの内部動作に関する、より技術的な詳細はこのページを参照してください。
プライマリキーを使わずにフィルタリングする例
テーブルの作成:
ALTER TABLE を使って、既存のテーブルに Projection を追加できます。
データの挿入:
この Projection により、元のテーブルで user_name が PRIMARY_KEY として定義されていなくても、user_name で高速にフィルタリングできるようになります。
クエリ実行時に ClickHouse は、データが user_name でソートされているため、Projection を使用した方が処理すべきデータ量が少なくなると判断しました。
クエリが Projection を使用しているか確認するには、system.query_log テーブルを確認します。projections フィールドには、使用された Projection の名前が格納されており、使用されていない場合は空です。
事前集計クエリの例
Projection を使用したテーブルの作成:
データの挿入
user_agent フィールドで GROUP BY を行う最初のクエリを実行します。このクエリでは、事前集約の条件が一致しないため、定義済みのプロジェクションは使用されません。
このプロジェクションを利用するには、事前集約および GROUP BY で使用されるフィールドの一部またはすべてを選択するクエリを実行します。
前述のとおり、system.query_log テーブルを参照できます。projections フィールドには、使用されたプロジェクション名が格納されており、プロジェクションが使用されていない場合は空になります。
_part_offset フィールドを用いた通常のプロジェクション
_part_offset フィールドを利用する通常のプロジェクションを持つテーブルを作成します。
サンプルデータを挿入する:
_part_offset をセカンダリインデックスとして使用する
_part_offset フィールドはマージやミューテーション後も値が保持されるため、セカンダリインデックスとして有用です。クエリでこれを活用できます。
プロジェクションの操作
プロジェクションに対して、次の操作を実行できます。
PROJECTION を追加する
ALTER TABLE [db.]name [ON CLUSTER cluster] ADD PROJECTION [IF NOT EXISTS] name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] ) [WITH SETTINGS ( setting_name1 = setting_value1, setting_name2 = setting_value2, ...)] - テーブルのメタデータに PROJECTION の定義を追加します。
WITH SETTINGS 句
WITH SETTINGS は PROJECTION レベルの設定を定義し、index_granularity や index_granularity_bytes のような設定によって、PROJECTION がデータをどのように保存するかをカスタマイズします。
これらは MergeTree テーブル設定に直接対応しますが、この PROJECTION に対してのみ適用されます。
例:
Projection の設定は、検証ルールに従う範囲で、その Projection に対して有効となるテーブル設定を上書きします(たとえば、無効または非互換な上書きは拒否されます)。
DROP PROJECTION
ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name - テーブルのメタデータからプロジェクションの定義を削除し、ディスクからプロジェクションファイルを削除します。mutation として実装されています。
MATERIALIZE PROJECTION
ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name] - このクエリは、パーティション partition_name 内でプロジェクション name を再構築します。mutation として実装されています。
CLEAR PROJECTION
ALTER TABLE [db.]table [ON CLUSTER cluster] CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name] - 定義は削除せずに、ディスクからプロジェクションファイルを削除します。mutationとして実装されています。
ADD、DROP、CLEAR コマンドは、メタデータを変更するかファイルを削除するだけの軽量な操作です。
また、これらの操作はレプリケートされ、ClickHouse Keeper または ZooKeeper を介してプロジェクションのメタデータを同期します。
プロジェクションの操作がサポートされるのは、*MergeTree エンジン(replicated バリアントを含む)のテーブルのみです。