MergeTree ファミリーのテーブルにアタッチできる、仮想的でセッションスコープのプロジェクションです。現在のセッション内にのみ存在し、EXPLAIN WHATIF で一覧表示されます。
EXPLAIN WHATIF は、仮説的なプロジェクションの効果をまだ見積もりません。いずれも status: not_applicable として報告されます。現時点で仮説的なプロジェクションを定義する利点は、マテリアライズせずに定義内容をテーブルに対して検証できること、および system.hypothetical_projections を読み取るツールで活用できることにあります。
CREATE HYPOTHETICAL PROJECTION
ALTER TABLE ... ADD PROJECTION と同じで、定義の検証もまったく同じように行われます。そのため、ここで拒否された projection は実際にマテリアライズすることもできません。何も構築されず、書き込まれもしません。保存されるのは定義内容のみで、しかも現在のセッション内に限られます。
name— projection 名。このセッションの(database, table)内で一意である必要があり、テーブル上の実在の projection と衝突してはなりません。- ボディは実在の projection と同じ形式を受け付けます。すなわち、
ORDER BYによる並べ替え projection、GROUP BYによる集約 projection、WHEREによるフィルタ付き projection、または projection インデックス形式のINDEX <expression> TYPE <projection_index_type>です。 WITH SETTINGS (...)も受け付けられ、そのまま保持されます。設定内容はsystem.hypothetical_projectionsで確認できます。
Atomic データベース内の MergeTree ファミリーのテーブル(すなわち UUID を持つテーブル)である必要があります。セッションストアがテーブルの UUID をキーとしてエントリを管理するためです。実在の ADD PROJECTION に課される制限はここでも同様に適用され、UNIQUE KEY を持つテーブル、deduplicate_merge_projection_mode = throw の下で Ordinary 以外のマージモードを使用するテーブル、旧構文の MergeTree、およびイミュータブルなディスクは拒否されます。
例
DROP HYPOTHETICAL PROJECTION
DROP ALL HYPOTHETICAL PROJECTIONS
DROP ALL HYPOTHETICAL INDEXES はその逆の動作となります。
スコープとライフタイム
- 仮説的なプロジェクションは現在のセッション内にのみ存在し、他のセッションからは参照できず、セッション終了時に破棄されます。
- 定義や削除を行っても projection は構築されず、そのテーブルに対する通常のクエリに影響することもありません。
- 現在のセッションの仮説的なプロジェクションは
system.hypothetical_projectionsで確認できます。
必要な権限
CREATE HYPOTHETICAL PROJECTION には、テーブルに対する ALTER ADD PROJECTION 権限が必要です。定義をテーブルのカラムと照合して検証するため、実際の ALTER TABLE ... ADD PROJECTION と同じ権限が求められます。テーブルのデータは読み取らないため、PROJECTION のカラムに対する SELECT 権限は現時点では不要です。ただし、EXPLAIN WHATIF が PROJECTION の見積もりを行うようになると、それらのカラムを読み取るため、その時点でカラムレベルの SELECT が必要になります。CREATE HYPOTHETICAL INDEX では、すでにこの権限が必要です。
DROP HYPOTHETICAL PROJECTION にも同じ権限が必要です。これは、削除時にテーブル名を指定することで、そのテーブルが存在するか、対象となり得るかが判明してしまうことを防ぐためです。DROP ALL HYPOTHETICAL PROJECTIONS はテーブル名を指定しないため、権限は不要です。