Гипотетические проекции — это виртуальные проекции, действующие в пределах сеанса, которые можно присоединить к таблице семейства MergeTree, фактически не создавая и не сохраняя их. Они существуют только в рамках текущего сеанса и отображаются в выводе EXPLAIN WHATIF.
EXPLAIN WHATIF пока не оценивает выигрыш от гипотетической проекции — для каждой из них выводится status: not_applicable. Тем не менее уже сейчас их полезно определять, чтобы проверить корректность определения на таблице без его материализации, а также для инструментов, которые читают 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, — поскольку определение проверяется на соответствие столбцам таблицы. Данные таблицы при этом не читаются, поэтому привилегия SELECT на столбцы проекции пока не требуется; когда EXPLAIN WHATIF начнёт оценивать проекции, он будет читать эти столбцы, и тогда потребуется SELECT на уровне столбца — как это уже сейчас необходимо для CREATE HYPOTHETICAL INDEX.
DROP HYPOTHETICAL PROJECTION требует той же привилегии, чтобы по указанию таблицы в операции удаления нельзя было определить, существует ли она и подходит ли. DROP ALL HYPOTHETICAL PROJECTIONS не указывает таблицу и не требует никаких привилегий.
См. также
Последнее изменение 26 сентября 2026 г.