プロジェクションの概要
- 主キーに含まれないカラムに対してクエリを実行する
- カラムを事前集計し、計算量と IO の両方を削減する
ディスク使用量プロジェクションは内部的に新しい非表示テーブルを作成するため、より多くの IO とディスク容量が必要になります。
たとえば、プロジェクションで異なる主キーを定義した場合、元のテーブルのすべてのデータが複製されます。
プロジェクションを使う
主キーを使わないフィルタリングの例
ALTER TABLE を使用すると、既存のテーブルにプロジェクションを追加できます。
user_name が PRIMARY_KEY として定義されていなくても、user_name で高速に絞り込めます。
クエリ時には、データが user_name 順に並んでいるため、プロジェクションを使ったほうが処理されるデータ量が少なくなると ClickHouse が判断します。
system.query_log テーブルを確認します。projections フィールドには、使用されたプロジェクション名が入り、何も使用されていない場合は空です。
事前集計クエリの例
projection_visits_by_user を持つテーブルを作成します:
user_agent を使って、GROUP BY を含む最初のクエリを実行します。
このクエリでは、事前集計が一致しないため、定義したプロジェクションは使用されません。
GROUP BY のフィールドの一部またはすべてを選択するクエリを実行できます。
system.query_log テーブルを確認することで把握できます。
projections フィールドには、使用されたプロジェクションの名前が表示されます。
プロジェクションが使用されていない場合、このフィールドは空になります。
プロジェクション索引の作成と使用
_part_offset フィールドは、マージやミューテーションを経てもその値が保持されるため、セカンダリ索引で有用です。これはクエリで活用できます:
プロジェクションの操作
ADD PROJECTION
WITH SETTINGS 句
WITH SETTINGS ではプロジェクションレベルの設定を定義し、プロジェクションでのデータの格納方法 (たとえば index_granularity や index_granularity_bytes) をカスタマイズできます。
これらは MergeTree のテーブル設定 に直接対応していますが、適用されるのはこのプロジェクションのみです。
例:
DROP PROJECTION
MATERIALIZE PROJECTION
partition_name のPROJECTION name を再構築します。
これは ミューテーション として実装されています。
CLEAR PROJECTION
ADD、DROP、CLEAR コマンドは、メタデータの変更またはファイルの削除だけを行うという意味で軽量です。
また、これらのコマンドはレプリケーションされ、ClickHouse Keeper または ZooKeeper を介してPROJECTIONのメタデータを同期します。
PROJECTIONの操作は、
*MergeTree エンジンのテーブルでのみサポートされます (レプリケーション対応のバリアントを含む) 。プロジェクションのマージ動作を制御する
ReplacingMergeTree テーブルエンジンを使用して保存されているとします。
マージ中に同じ行が複数の入力パーツで検出された場合、もっとも新しい行バージョン (もっとも最近に挿入されたパーツのもの) だけが保持され、それ以前のすべてのバージョンは破棄されます。
同様に、テーブルが AggregatingMergeTree テーブルエンジンを使用して保存されている場合、マージ操作によって、入力パーツ内の同じ行が主キーの値に基づいて 1 行にまとめられ、部分的な集約状態が更新されることがあります。
ClickHouse v24.8 より前では、プロジェクションパーツはメインデータと気づかれないまま同期がずれるか、あるいは更新や削除などの特定の操作をまったく実行できませんでした。これは、テーブルにプロジェクションがある場合、データベースが自動的に例外を送出していたためです。
v24.8 以降では、新しいテーブルレベル設定 deduplicate_merge_projection_mode により、前述の単純ではないバックグラウンドマージ操作が元のテーブルのパーツで発生した場合の動作を制御できます。
Delete mutations も、元のテーブルのパーツ内の行を削除する part merge 操作の別の例です。v24.7 以降では、論理削除によってトリガーされる delete mutations に関する動作を制御する設定もあります: lightweight_mutation_projection_mode。
以下は、deduplicate_merge_projection_mode と lightweight_mutation_projection_mode の両方で設定可能な値です。
throw(デフォルト): 例外が送出され、プロジェクションパーツの同期ずれを防ぎます。drop: 影響を受けるプロジェクションテーブルパーツは削除されます。影響を受けたプロジェクションパーツについては、クエリは元のテーブルパーツにフォールバックします。rebuild: 影響を受けたプロジェクションパーツは、元のテーブルパーツ内のデータとの整合性を保つために再構築されます。
制限事項
ORDER BY句では、ALIASカラムは使用できません。例:
ALIAS カラムは物理的に保存されず、クエリ時にその場で計算されるため、ソート式が評価されるプロジェクションパートの書き込み処理では使用できません。
代わりに、MATERIALIZED カラムを使用するか、式を直接埋め込んでください。