> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по гипотетическим (what-if) проекциям

# HYPOTHETICAL PROJECTION

Гипотетические проекции — это виртуальные проекции, действующие в пределах сеанса, которые можно присоединить к таблице семейства `MergeTree`, фактически не создавая и не сохраняя их. Они существуют только в рамках текущего сеанса и отображаются в выводе [`EXPLAIN WHATIF`](/docs/ru/reference/statements/explain#explain-whatif).

`EXPLAIN WHATIF` пока не оценивает выигрыш от гипотетической проекции — для каждой из них выводится `status: not_applicable`. Тем не менее уже сейчас их полезно определять, чтобы проверить корректность определения на таблице без его материализации, а также для инструментов, которые читают [`system.hypothetical_projections`](/docs/ru/reference/system-tables/hypothetical_projections).

## CREATE HYPOTHETICAL PROJECTION

```sql theme={null}
CREATE HYPOTHETICAL PROJECTION [IF NOT EXISTS] name
    ON [db.]table_name (SELECT <columns> [WHERE ...] [GROUP BY ...] [ORDER BY ...]) [WITH SETTINGS (...)]

CREATE HYPOTHETICAL PROJECTION [IF NOT EXISTS] name
    ON [db.]table_name INDEX <expression> TYPE <projection_index_type> [WITH SETTINGS (...)]
```

Синтаксис повторяет `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` со старым синтаксисом и неизменяемые диски.

**Пример**

```sql theme={null}
CREATE HYPOTHETICAL PROJECTION p_by_b ON t (SELECT a, b ORDER BY b);
CREATE HYPOTHETICAL PROJECTION p_idx ON t INDEX b TYPE basic;
```

## DROP HYPOTHETICAL PROJECTION

```sql theme={null}
DROP HYPOTHETICAL PROJECTION [IF EXISTS] name ON [db.]table_name
```

Удаляет гипотетическую проекцию из текущего сеанса.

## DROP ALL HYPOTHETICAL PROJECTIONS

```sql theme={null}
DROP ALL HYPOTHETICAL PROJECTIONS
```

Удаляет все гипотетические проекции, определённые в текущем сеансе, независимо от таблицы. Гипотетические индексы при этом не затрагиваются; команда `DROP ALL HYPOTHETICAL INDEXES` действует наоборот.

## Область действия и время жизни

* Гипотетические проекции существуют только в рамках **текущего сеанса** — они не видны другим сеансам и удаляются по его завершении.
* Их создание или удаление не приводит к построению проекции и никак не влияет на обычные запросы к таблице.
* Просмотреть гипотетические проекции текущего сеанса можно через [`system.hypothetical_projections`](/docs/ru/reference/system-tables/hypothetical_projections).

## Необходимые привилегии

`CREATE HYPOTHETICAL PROJECTION` требует привилегии `ALTER ADD PROJECTION` для таблицы — той же самой, что нужна для настоящего `ALTER TABLE ... ADD PROJECTION`, — поскольку определение проверяется на соответствие столбцам таблицы. Данные таблицы при этом не читаются, поэтому привилегия `SELECT` на столбцы проекции пока не требуется; когда `EXPLAIN WHATIF` начнёт оценивать проекции, он будет читать эти столбцы, и тогда потребуется `SELECT` на уровне столбца — как это уже сейчас необходимо для [`CREATE HYPOTHETICAL INDEX`](/docs/ru/reference/statements/hypothetical-index#required-privileges).

`DROP HYPOTHETICAL PROJECTION` требует той же привилегии, чтобы по указанию таблицы в операции удаления нельзя было определить, существует ли она и подходит ли. `DROP ALL HYPOTHETICAL PROJECTIONS` не указывает таблицу и не требует никаких привилегий.

## См. также

* [`CREATE HYPOTHETICAL INDEX`](/docs/ru/reference/statements/hypothetical-index)
* [`EXPLAIN WHATIF`](/docs/ru/reference/statements/explain#explain-whatif)
* [`system.hypothetical_projections`](/docs/ru/reference/system-tables/hypothetical_projections)
* [Проекции](/docs/ru/reference/engines/table-engines/mergetree-family/mergetree#projections)
