MergeTree, фактически не создавая и не сохраняя их. Они существуют только в рамках текущего сеанса и отображаются в выводе EXPLAIN WHATIF.
EXPLAIN WHATIF оценивает обычные (сортирующие) гипотетические проекции: сколько меток и строк будет затронуто при чтении проекции для данного запроса и выберет ли её оптимизатор вместо базовой таблицы. Оцениваются не все проекции: в частности, агрегирующие проекции и проекции с предложением WHERE не оцениваются, а для каждого неоценённого кандидата указывается причина. Полный список см. в EXPLAIN WHATIF. Гипотетические проекции сеанса также отображаются в system.hypothetical_projections.
CREATE HYPOTHETICAL PROJECTION
ALTER TABLE ... ADD PROJECTION, а определение проверяется точно так же, поэтому проекция, отклонённая здесь, не могла бы быть материализована и в реальности. Ничего не строится и не записывается — в текущем сеансе сохраняется только описание.
name— имя проекции; должно быть уникальным в пределах(database, table)для этого сеанса и не должно совпадать с именем реальной проекции таблицы.- Тело допускает те же формы, что и реальная проекция: проекцию с переупорядочиванием (
ORDER BY), агрегирующую (GROUP BY), отфильтрованную (WHERE) либо форму проекции-индексаINDEX <expression> TYPE <projection_index_type>. WITH SETTINGS (...)принимается и сохраняется; настройки видны вsystem.hypothetical_projections.
MergeTree в базе данных Atomic (у неё должен быть UUID), поскольку сеансовое хранилище индексирует записи по UUID таблицы. Здесь действуют и те же ограничения, что и для реального ADD PROJECTION: отклоняются таблицы с UNIQUE KEY, режимы слияния, отличные от Ordinary, при deduplicate_merge_projection_mode = throw, MergeTree со старым синтаксисом и неизменяемые диски.
Пример
DROP HYPOTHETICAL PROJECTION
DROP ALL HYPOTHETICAL PROJECTIONS
DROP ALL HYPOTHETICAL INDEXES действует наоборот.
Область действия и время жизни
- Гипотетические проекции существуют только в рамках текущего сеанса — они не видны другим сеансам и удаляются по его завершении.
- Их создание или удаление не приводит к построению проекции и никак не влияет на обычные запросы к таблице.
- Просмотреть гипотетические проекции текущего сеанса можно через
system.hypothetical_projections.
Необходимые привилегии
CREATE HYPOTHETICAL PROJECTION требует привилегии ALTER ADD PROJECTION для таблицы — той же самой, что нужна для настоящего ALTER TABLE ... ADD PROJECTION, — поскольку определение проверяется на соответствие столбцам таблицы. Чтобы оценить проекцию, EXPLAIN WHATIF требует привилегии SELECT на уровне столбца для столбцов проекции — так же, как это уже происходит для CREATE HYPOTHETICAL INDEX.
DROP HYPOTHETICAL PROJECTION требует той же привилегии, чтобы по указанию таблицы в операции удаления нельзя было определить, существует ли она и подходит ли; кроме того, EXPLAIN WHATIF повторно проверяет эту привилегию, прежде чем сверить сохранённое определение с таблицей. DROP ALL HYPOTHETICAL PROJECTIONS не указывает таблицу и не требует никаких привилегий.