> ## 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.

> Documentation sur les projections hypothétiques (what-if)

# HYPOTHETICAL PROJECTION

Les projections hypothétiques sont des projections virtuelles, dont la portée est limitée à la session, que vous pouvez attacher à une table de la famille `MergeTree` sans réellement les construire ni les stocker. Elles n'existent qu'au sein de la session en cours et sont répertoriées par [`EXPLAIN WHATIF`](https://clickhouse.com/docs/fr/reference/statements/explain#explain-whatif).

`EXPLAIN WHATIF` estime, pour les projections hypothétiques ordinaires (triées), le nombre de marques et de lignes que leur lecture parcourrait pour une requête, ainsi que la probabilité que l'optimiseur de requêtes les choisisse plutôt que la table de base. Toutes les projections ne font pas l'objet d'une estimation : c'est notamment le cas des projections agrégées et de celles comportant une clause `WHERE`. Chaque projection candidate non estimée est répertoriée avec la raison de cette absence d'estimation. Consultez [`EXPLAIN WHATIF`](https://clickhouse.com/docs/fr/reference/statements/explain#explain-whatif) pour obtenir la liste complète. Les projections hypothétiques de la session sont également visibles dans [`system.hypothetical_projections`](https://clickhouse.com/docs/fr/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 (...)]
```

La syntaxe reprend celle de `ALTER TABLE ... ADD PROJECTION`, et la définition est validée exactement de la même manière : une projection rejetée ici n'aurait de toute façon pas pu être matérialisée. Rien n'est construit ni écrit — seule la description est stockée, dans la session en cours.

* `name` — nom de la projection ; il doit être unique au sein de `(database, table)` pour cette session et ne doit pas entrer en conflit avec une projection réelle de la table.
* Le body accepte les mêmes formes qu'une projection réelle : une projection de réordonnancement avec `ORDER BY`, une projection d'agrégation avec `GROUP BY`, une projection filtrée avec `WHERE`, ou la forme d'index de projection `INDEX <expression> TYPE <projection_index_type>`.
* `WITH SETTINGS (...)` est accepté et conservé ; les paramètres sont visibles dans `system.hypothetical_projections`.

La table cible doit être une table de la famille `MergeTree` dans une base de données `Atomic` (elle doit posséder un UUID), car le stockage de session indexe les entrées par UUID de table. Les restrictions imposées par un véritable `ADD PROJECTION` s'appliquent également ici : les tables avec `UNIQUE KEY`, les modes de merging non-`Ordinary` sous `deduplicate_merge_projection_mode = throw`, les `MergeTree` en ancienne syntaxe et les disques immuables sont rejetés.

**Exemple**

```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
```

Supprime une projection hypothétique de la session en cours.

## DROP ALL HYPOTHETICAL PROJECTIONS

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

Supprime toutes les projections hypothétiques définies dans la session en cours, quelle que soit la table. Les index hypothétiques ne sont pas affectés ; `DROP ALL HYPOTHETICAL INDEXES` fait l'inverse.

## Portée et durée de vie

* Les projections hypothétiques n'existent que dans la **session en cours** : elles sont invisibles pour les autres sessions et supprimées à la fin de celle-ci.
* Le fait d'en définir une ou d'en supprimer une ne construit aucune projection et n'affecte jamais les requêtes ordinaires sur la table.
* Consultez les projections hypothétiques de la session en cours via [`system.hypothetical_projections`](https://clickhouse.com/docs/fr/reference/system-tables/hypothetical_projections).

## Privilèges requis

`CREATE HYPOTHETICAL PROJECTION` nécessite le privilège `ALTER ADD PROJECTION` sur la table — le même privilège que celui exigé par la véritable instruction `ALTER TABLE ... ADD PROJECTION` — car la définition est validée par rapport aux colonnes de la table. `EXPLAIN WHATIF` nécessite le privilège `SELECT` au niveau des colonnes sur les colonnes de la projection pour pouvoir l'estimer, comme c'est déjà le cas pour [`CREATE HYPOTHETICAL INDEX`](https://clickhouse.com/docs/fr/reference/statements/hypothetical-index#required-privileges).

`DROP HYPOTHETICAL PROJECTION` exige le même privilège, afin que le fait de nommer une table dans une suppression ne puisse pas révéler si celle-ci existe ou si elle est éligible, et `EXPLAIN WHATIF` le vérifie de nouveau avant de valider une définition stockée par rapport à la table. `DROP ALL HYPOTHETICAL PROJECTIONS` ne nomme aucune table et ne nécessite aucun privilège.

## Voir aussi

* [`CREATE HYPOTHETICAL INDEX`](https://clickhouse.com/docs/fr/reference/statements/hypothetical-index)
* [`EXPLAIN WHATIF`](https://clickhouse.com/docs/fr/reference/statements/explain#explain-whatif)
* [`system.hypothetical_projections`](https://clickhouse.com/docs/fr/reference/system-tables/hypothetical_projections)
* [Projections](https://clickhouse.com/docs/fr/reference/engines/table-engines/mergetree-family/mergetree.md#projections)
