プロジェクション
プロジェクションは、クエリの実行を最適化する形式でデータを保存します。この機能は以下に役立ちます。
- 主キーの一部でないカラムに対してクエリを実行する
- カラムを事前に集約することで、計算とIOの両方を削減します
テーブルに対して1つ以上のプロジェクションを定義でき、クエリ分析時に、ユーザーが提供したクエリを変更することなく、スキャンするデータが最も少ないプロジェクションがClickHouseによって選択されます。
プロジェクションは内部で新しい隠しテーブルを作成します。これは、より多くのIOとディスク上のスペースが必要になることを意味します。 例えば、プロジェクションに異なる主キーが定義されている場合、元のテーブルのすべてのデータが複製されます。
プロジェクションが内部でどのように機能するかについての詳細な技術情報は、この ページ で確認できます。
主キーを使用せずにフィルタリングの例
テーブルの作成:
ALTER TABLE
を使用して、既存のテーブルにプロジェクションを追加することができます:
データの挿入:
プロジェクションを使用することで、元のテーブルでuser_name
がPRIMARY_KEY
として定義されていなくても、user_name
によるフィルタリングを迅速に行うことができます。
クエリ実行時にClickHouseは、プロジェクションを使用することで処理されるデータが少なくなると判断しました。なぜなら、データはuser_name
で順序付けられているからです。
クエリがプロジェクションを使用しているかどうかを確認するには、system.query_log
テーブルを確認できます。projections
フィールドには、使用されているプロジェクションの名前が表示され、使用されていない場合は空になります:
事前集約クエリの例
プロジェクションを持つテーブルの作成:
データの挿入:
最初のクエリをGROUP BY
を使用してuser_agent
フィールドに対して実行します。このクエリは、事前集約が一致しないため、定義されたプロジェクションを使用しません。
プロジェクションを使用するには、事前集約および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] )
- テーブルメタデータにプロジェクションの説明を追加します。
PROJECTIONを削除
ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name
- テーブルメタデータからプロジェクションの説明を削除し、ディスクからプロジェクションファイルを削除します。ミューテーションとして実装されています。
PROJECTIONをマテリアライズ
ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name]
- クエリがpartition_name
においてプロジェクションname
を再構築します。ミューテーションとして実装されています。
PROJECTIONをクリア
ALTER TABLE [db.]table [ON CLUSTER cluster] CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name]
- 説明を削除せずにディスクからプロジェクションファイルを削除します。ミューテーションとして実装されています。
コマンドADD
、DROP
、CLEAR
は、メタデータを変更するか、ファイルを削除するだけなので軽量です。
また、これらはレプリケーションされ、ClickHouse KeeperまたはZooKeeperを介してプロジェクションメタデータを同期します。
プロジェクションの操作は、*MergeTree
エンジンを持つテーブルに対してのみサポートされています(レプリケートバリアントを含む)。