MergeTree sin necesidad de construirlas ni almacenarlas. Existen únicamente dentro de la sesión actual y se listan mediante 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 para ver la lista completa. Las PROJECTIONS hipotéticas de la sesión también pueden consultarse en system.hypothetical_projections.
CREATE HYPOTHETICAL PROJECTION
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 conGROUP BY, una filtrada conWHERE, o la forma de índice de PROJECTIONINDEX <expression> TYPE <projection_index_type>. WITH SETTINGS (...)se acepta y se conserva; los ajustes pueden consultarse ensystem.hypothetical_projections.
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
DROP HYPOTHETICAL PROJECTION
DROP ALL HYPOTHETICAL PROJECTIONS
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.
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.
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.