Descripción general de las proyecciones
- Ejecutar consultas sobre una columna que no forma parte de la clave primaria
- Preagregar columnas, lo que reduce tanto el cómputo como la E/S
Uso de discoLas proyecciones crean internamente una nueva tabla oculta, lo que implica más E/S y más espacio en disco.
Por ejemplo, si la proyección define una clave primaria diferente, todos los datos de la tabla original se duplicarán.
Uso de las proyecciones
Ejemplo de filtrado sin usar claves primarias
ALTER TABLE, podemos añadir la proyección a una tabla existente:
user_name, incluso si en la tabla original user_name no estaba definido como PRIMARY_KEY.
En tiempo de consulta, ClickHouse determina que se procesarán menos datos si se utiliza la proyección, ya que los datos están ordenados por user_name.
system.query_log. En el campo projections aparece el nombre de la proyección utilizada, o queda vacío si no se ha usado ninguna:
Ejemplo de consulta de preagregación
projection_visits_by_user:
GROUP BY usando el campo user_agent.
Esta consulta no aprovechará la proyección definida, ya que la agregación previa no coincide.
GROUP BY:
system.query_log para comprobar si se utilizó una proyección.
El campo projections muestra el nombre de la proyección utilizada.
Estará vacío si no se ha utilizado ninguna proyección:
Creación y uso de índices de proyección
_part_offset conserva su valor tras las fusiones y mutaciones, lo que lo hace útil para la indexación secundaria. Podemos aprovecharlo en las consultas:
Gestión de proyecciones
ADD PROJECTION
Cláusula WITH SETTINGS
WITH SETTINGS define ajustes a nivel de proyección, que personalizan cómo la proyección almacena los datos (por ejemplo, index_granularity o index_granularity_bytes).
Estos corresponden directamente a los ajustes de tabla de MergeTree, pero se aplican solo a esta proyección.
Ejemplo:
DROP PROJECTION
MATERIALIZE PROJECTION
name en la partición partition_name.
Esto se implementa como una mutación.
CLEAR PROJECTION
ADD, DROP y CLEAR son ligeros en el sentido de que solo modifican metadatos o eliminan archivos.
Además, se replican y sincronizan los metadatos de las proyecciones mediante ClickHouse Keeper o ZooKeeper.
La manipulación de proyecciones solo se admite en tablas con motor
*MergeTree (incluidas las variantes replicadas).Control del comportamiento de las fusiones de proyecciones
ReplacingMergeTree.
Si se detecta la misma fila en varias partes de entrada durante la fusión, solo se conservará la versión más reciente de la fila (la de la parte insertada más recientemente), mientras que todas las versiones anteriores se descartarán.
De forma similar, si la tabla se almacena usando el motor de tabla AggregatingMergeTree, la operación de fusión puede combinar las mismas filas de las partes de entrada (según los valores de la clave primaria) en una sola fila para actualizar los estados de agregación parciales.
Antes de ClickHouse v24.8, las partes de proyección o bien quedaban desincronizadas silenciosamente con los datos principales, o bien ciertas operaciones, como actualizaciones y eliminaciones, no podían ejecutarse en absoluto, ya que la base de datos lanzaba automáticamente una excepción si la tabla tenía proyecciones.
Desde la versión v24.8, una nueva configuración a nivel de tabla deduplicate_merge_projection_mode controla el comportamiento cuando las operaciones en segundo plano de fusión no triviales mencionadas anteriormente se producen en partes de la tabla original.
Las mutaciones de eliminación son otro ejemplo de operaciones de fusión de partes que eliminan filas en las partes de la tabla original. Desde la versión v24.7, también disponemos de una configuración para controlar el comportamiento con respecto a las mutaciones de eliminación activadas por eliminaciones ligeras: lightweight_mutation_projection_mode.
A continuación se indican los posibles valores tanto de deduplicate_merge_projection_mode como de lightweight_mutation_projection_mode:
throw(predeterminado): Se lanza una excepción, lo que evita que las partes de proyección queden desincronizadas.drop: Se eliminan las partes afectadas de la tabla de proyección. Las consultas recurrirán a la parte de la tabla original para las partes de proyección afectadas.rebuild: La parte de proyección afectada se reconstruye para mantener la coherencia con los datos de la parte de la tabla original.
Limitaciones
ALIAS en la cláusula ORDER BY de una proyección. Por ejemplo:
ALIAS no se almacenan físicamente y se calculan sobre la marcha en el momento de la consulta, por lo que no están disponibles durante la fase de escritura de partes de la proyección, cuando se evalúa la expresión de ordenación.
En su lugar, use columnas MATERIALIZED o escriba la expresión directamente en línea: