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 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 pour obtenir la liste complète. Les projections hypothétiques de la session sont également visibles dans 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. 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. 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