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

См. также