Skip to main content
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. EXPLAIN WHATIF n’estime pas encore le bénéfice d’une projection hypothétique : il les signale toutes avec status: not_applicable. Les définir présente aujourd’hui un intérêt pour valider une définition sur la table sans la matérialiser, ainsi que pour les outils qui lisent system.hypothetical_projections.

CREATE HYPOTHETICAL PROJECTION

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

DROP HYPOTHETICAL PROJECTION

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

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.

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. Aucune donnée de la table n’est lue, si bien que le privilège SELECT sur les colonnes de la projection n’est pas encore nécessaire ; lorsque EXPLAIN WHATIF commencera à estimer les projections, il lira ces colonnes et le privilège SELECT au niveau des colonnes sera alors requis, comme c’est déjà le cas pour CREATE HYPOTHETICAL INDEX. 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. DROP ALL HYPOTHETICAL PROJECTIONS ne nomme aucune table et ne nécessite aucun privilège.

Voir aussi

Dernière modification le 26 septembre 2026