MergeTree ファミリーのテーブルにアタッチできる、仮想的でセッションスコープの PROJECTION です。現在のセッション内にのみ存在し、EXPLAIN WHATIF で一覧表示されます。
EXPLAIN WHATIF は、通常の (ソート済みの) 仮説的な PROJECTION について、クエリでその PROJECTION を読み取る場合にアクセスするマークと行の数、およびオプティマイザーが基となるテーブルではなくその PROJECTION を選択するかどうかを見積もります。すべての PROJECTION が見積もりの対象になるわけではありません。集約 PROJECTION や WHERE 句を持つ PROJECTION はその例です。見積もりの対象外となった候補は、その理由とともに一覧表示されます。対象外となるケースの全リストについては、EXPLAIN WHATIF を参照してください。セッション内の仮説的な PROJECTION は、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 と同じ権限が求められます。EXPLAIN WHATIF で PROJECTION を見積もるには、そのカラムに対するカラムレベルの SELECT 権限が必要です。CREATE HYPOTHETICAL INDEX では、すでにこの権限が必要です。
DROP HYPOTHETICAL PROJECTION にも同じ権限が必要です。これは、削除時にテーブル名を指定することで、そのテーブルが存在するか、対象となり得るかが判明してしまうことを防ぐためです。また、EXPLAIN WHATIF は保存された定義をテーブルと照合して検証する前に、この権限を再確認します。DROP ALL HYPOTHETICAL PROJECTIONS はテーブル名を指定しないため、権限は不要です。