Skip to main content
Гипотетические проекции — это виртуальные проекции, действующие в пределах сеанса, которые можно присоединить к таблице семейства 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 г.