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

> Documentación de las PROJECTIONS hipotéticas (what-if)

# HYPOTHETICAL PROJECTION

Las PROJECTIONS hipotéticas son PROJECTIONS virtuales, con alcance de sesión, que puede adjuntar a una tabla de la familia `MergeTree` sin necesidad de construirlas ni almacenarlas. Existen únicamente dentro de la sesión actual y se listan mediante [`EXPLAIN WHATIF`](https://clickhouse.com/docs/es/reference/statements/explain#explain-whatif).

`EXPLAIN WHATIF` estima las PROJECTIONS hipotéticas normales (ordenadas): a cuántas marcas y filas accedería la lectura de la PROJECTION para una consulta y si el optimizador la elegiría en lugar de la tabla base. No se estiman todas las PROJECTIONS: las PROJECTIONS de agregación y las que tienen una cláusula `WHERE` son dos de esos casos. Los candidatos que no se estiman aparecen en la lista junto con el motivo. Consulte [`EXPLAIN WHATIF`](https://clickhouse.com/docs/es/reference/statements/explain#explain-whatif) para ver la lista completa. Las PROJECTIONS hipotéticas de la sesión también pueden consultarse en [`system.hypothetical_projections`](https://clickhouse.com/docs/es/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 sintaxis es análoga a la de `ALTER TABLE ... ADD PROJECTION`, y la definición se valida exactamente igual, por lo que una PROJECTION rechazada aquí tampoco se habría podido materializar. No se construye ni se escribe nada: solo se almacena la descripción, en la sesión actual.

* `name` — nombre de la PROJECTION; debe ser único dentro de `(database, table)` para esta sesión y no debe entrar en conflicto con una PROJECTION real de la tabla.
* El cuerpo admite las mismas formas que una PROJECTION real: una PROJECTION de reordenamiento con `ORDER BY`, una de agregación con `GROUP BY`, una filtrada con `WHERE`, o la forma de índice de PROJECTION `INDEX <expression> TYPE <projection_index_type>`.
* `WITH SETTINGS (...)` se acepta y se conserva; los ajustes pueden consultarse en `system.hypothetical_projections`.

La tabla de destino debe ser una tabla de la familia `MergeTree` en una base de datos `Atomic` (debe tener un UUID), ya que el almacén de sesión indexa las entradas por el UUID de la tabla. Las restricciones que impone un `ADD PROJECTION` real también se aplican aquí: se rechazan las tablas con `UNIQUE KEY`, los modos de fusión distintos de `Ordinary` con `deduplicate_merge_projection_mode = throw`, las tablas `MergeTree` con sintaxis antigua y los discos inmutables.

**Ejemplo**

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

Elimina una PROJECTION hipotética de la sesión actual.

## DROP ALL HYPOTHETICAL PROJECTIONS

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

Elimina todas las PROJECTIONS hipotéticas definidas en la sesión actual, sin importar la tabla. Los índices hipotéticos no se ven afectados; `DROP ALL HYPOTHETICAL INDEXES` hace lo contrario.

## Alcance y ciclo de vida

* Las PROJECTIONS hipotéticas solo existen en la **sesión actual**: son invisibles para las demás sesiones y se descartan al finalizar la sesión.
* Definir o eliminar una no construye ninguna PROJECTION ni afecta jamás a las consultas ordinarias sobre la tabla.
* Consulte las PROJECTIONS hipotéticas de la sesión actual mediante [`system.hypothetical_projections`](https://clickhouse.com/docs/es/reference/system-tables/hypothetical_projections).

## Privilegios requeridos

`CREATE HYPOTHETICAL PROJECTION` requiere `ALTER ADD PROJECTION` sobre la tabla —el mismo privilegio que necesita el `ALTER TABLE ... ADD PROJECTION` real— porque valida la definición frente a las columnas de la tabla. `EXPLAIN WHATIF` requiere `SELECT` a nivel de columna sobre las columnas de la PROJECTION para estimarla, tal como ya ocurre con [`CREATE HYPOTHETICAL INDEX`](https://clickhouse.com/docs/es/reference/statements/hypothetical-index#required-privileges).

`DROP HYPOTHETICAL PROJECTION` requiere el mismo privilegio, de modo que nombrar una tabla en un `DROP` no pueda revelar si existe o si es apta, y `EXPLAIN WHATIF` vuelve a comprobar ese privilegio antes de validar una definición almacenada frente a la tabla. `DROP ALL HYPOTHETICAL PROJECTIONS` no nombra ninguna tabla y no requiere ningún privilegio.

## Véase también

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