Projections
Projectionsはクエリ実行を最適化する形式でデータを格納します。この機能は次のような場合に便利です:
- 主キーの一部ではないカラムに対してクエリを実行する場合
- カラムを前集約することで、計算と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
フィールドはマージや変異を通じてその値を保持し、セカンダリインデックスとして有用です。これをクエリで活用できます:
プロジェクションの操作
次の操作が可能です プロジェクション:
ADD PROJECTION
ALTER TABLE [db.]name [ON CLUSTER cluster] ADD PROJECTION [IF NOT EXISTS] name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] )
- テーブルメタデータにプロジェクションの説明を追加します。
DROP PROJECTION
ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name
- テーブルメタデータからプロジェクションの説明を削除し、ディスクからプロジェクションファイルを削除します。変異として実装されています。
MATERIALIZE PROJECTION
ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name]
- クエリは partition_name
内のプロジェクション name
を再構築します。変異として実装されています。
CLEAR PROJECTION
ALTER TABLE [db.]table [ON CLUSTER cluster] CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name]
- 説明を削除することなくディスクからプロジェクションファイルを削除します。変異として実装されています。
コマンド ADD
、DROP
および CLEAR
は、メタデータを変更するか、ファイルを削除するだけの軽量です。
また、これらはレプリケートされ、ClickHouse Keeper または ZooKeeper を介してプロジェクションメタデータが同期されます。
プロジェクションの操作は、*MergeTree
エンジン(レプリケーション バリアントを含む)を持つテーブルに対してのみサポートされています。