メインコンテンツまでスキップ
メインコンテンツまでスキップ

プロジェクション

プロジェクションはクエリ実行を最適化する形式でデータを格納します。この機能は以下の用途に便利です:

  • 主キーの一部ではないカラムに対してクエリを実行すること
  • カラムの事前集計を行うことで、計算とI/Oの両方を削減すること

テーブルに対して1つ以上のプロジェクションを定義することができ、クエリ分析中に必要なデータを最小限にスキャンするプロジェクションがClickHouseによって選択されます。ユーザーが提供したクエリは変更されません。

ディスク使用量

プロジェクションは内部に新しい隠れたテーブルを作成します。このため、より多くのI/Oおよびディスクスペースが必要になります。 例えば、プロジェクションが異なる主キーを定義している場合、元のテーブルのすべてのデータが重複します。

プロジェクションの内部動作に関する詳細な技術情報はこの ページ で見ることができます。

主キーを使用しないフィルタリングの例

テーブルの作成:

ALTER TABLE を使用して、既存のテーブルにプロジェクションを追加できます:

データの挿入:

プロジェクションを使用することで、元のテーブルで user_namePRIMARY_KEY として定義されていなくても、user_name で高速にフィルタリングできます。 クエリ実行時にClickHouseは、プロジェクションを使用することで処理するデータが少なくなることを判断しました。データは user_name によって順序付けられています。

クエリがプロジェクションを使用しているか確認するには、system.query_log テーブルを確認できます。projections フィールドには、使用されたプロジェクションの名前が表示され、使用されていない場合は空になります:

事前集計クエリの例

プロジェクションを含むテーブルを作成:

データの挿入:

最初のクエリを GROUP BY を使用して user_agent フィールドで実行します。このクエリはプロジェクションを使用しません。事前集計が一致しないためです。

プロジェクションを使用するには、事前集計または GROUP BY フィールドの一部またはすべてを選択するクエリを実行できます。

前述のように、system.query_log テーブルを確認できます。projections フィールドには、使用されたプロジェクションの名前が表示され、使用されていない場合は空になります:

プロジェクションの操作

次の操作は プロジェクション に対して利用可能です:

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] - 説明を削除せずに、ディスクからプロジェクションファイルを削除します。これは 変異 として実装されています。

ADDDROP、および CLEAR コマンドは、メタデータを変更するかファイルを削除するだけであるため、軽量です。

また、これらはレプリケートされており、ClickHouse Keeper または ZooKeeper を介してプロジェクションのメタデータを同期します。

注記

プロジェクションの操作は、*MergeTree エンジン(レプリケート バリアントを含む)を持つテーブルに対してのみサポートされています。