OPTIMIZE TABLE ... FINAL (consulta esta documentación), ya que su uso está pensado para tareas de administración, no para las operaciones diarias.
OPTIMIZE no puede corregir el error Too many parts.OPTIMIZE es compatible con la familia MergeTree (incluidas las vistas materializadas) y con los motores Buffer. Otros motores de tablas no son compatibles.
Cuando OPTIMIZE se usa con la familia ReplicatedMergeTree de motores de tablas, ClickHouse crea una tarea de fusión y espera a que se ejecute en todas las réplicas (si el ajuste alter_sync está establecido en 2) o en la réplica actual (si el ajuste alter_sync está establecido en 1).
- Si
OPTIMIZEno realiza ninguna fusión por cualquier motivo, no se notifica al cliente. Para habilitar las notificaciones, use el ajuste optimize_throw_if_noop. - Si especifica una
PARTITION, solo se optimiza la partición indicada. Cómo establecer la expresión de partición. - Si especifica
FINALoFORCE, la optimización se realiza incluso cuando todos los datos ya están en una sola parte. Puede controlar este comportamiento con optimize_skip_merged_partitions. Además, la fusión se fuerza incluso si se están realizando fusiones concurrentes. - Si especifica
DEDUPLICATE, se realizará la deduplicación de las filas completamente idénticas (salvo que se especifique una cláusula BY; se comparan todas las columnas); esto solo tiene sentido para el motor MergeTree.
OPTIMIZE mediante el ajuste replication_wait_for_inactive_replica_timeout.
Si
alter_sync está establecido en 2 y algunas réplicas permanecen inactivas durante más tiempo del especificado por el ajuste replication_wait_for_inactive_replica_timeout, se lanza una excepción UNFINISHED.DRY RUN
DRY RUN simula una fusión de las partes especificadas sin aplicar el resultado. La parte fusionada se escribe en una ubicación temporal, se valida y luego se descarta. Las partes originales y los datos de la tabla permanecen sin cambios.
Esto resulta útil para:
- Probar la corrección de la fusión entre versiones de ClickHouse.
- Reproducir de forma determinista errores relacionados con la fusión.
- Realizar benchmarks del rendimiento de la fusión.
DRY RUN solo es compatible con tablas de la familia MergeTree. La palabra clave PARTS, junto con una lista de nombres de partes, es obligatoria. Todas las partes especificadas deben existir, estar activas y pertenecer a la misma partición.
DRY RUN es incompatible con FINAL y PARTITION. Puede combinarse con DEDUPLICATE (con especificación opcional de columnas) y CLEANUP (para tablas ReplacingMergeTree).
Sintaxis
CHECK TABLE. Este comportamiento está controlado por la configuración optimize_dry_run_check_part (habilitada de forma predeterminada). Deshabilitarla omite la validación, lo que puede ser útil para hacer benchmark de la operación de fusión en sí.
Ejemplo
Expresión BY
*, COLUMNS o EXCEPT. La lista de columnas escrita explícitamente o expandida implícitamente debe incluir todas las columnas especificadas en la expresión de ordenación de filas (tanto la clave primaria como la clave de ordenación) y en la expresión de particionado (la clave de particionado).
Tenga en cuenta que
* se comporta igual que en SELECT: las columnas MATERIALIZED y ALIAS no se usan en la expansión.Además, es un error especificar una lista vacía de columnas, escribir una expresión que dé como resultado una lista vacía de columnas o deduplicar por una columna ALIAS.Query
Query
Query
Response
DEDUPLICATE
Query
Query
Response
DEDUPLICATE BY *
ALIAS ni MATERIALIZED. Teniendo en cuenta la tabla anterior, estas son las columnas primary_key, secondary_key, value y partition_key:
Query
Query
Response
DEDUPLICATE BY * EXCEPT
ALIAS ni MATERIALIZED, y excluyendo explícitamente value: las columnas primary_key, secondary_key y partition_key.
Query
Query
Response
DEDUPLICATE BY <list of columns>
primary_key, secondary_key y partition_key:
Query
Query
Response
DEDUPLICATE BY COLUMNS(<regex>)
primary_key, secondary_key y partition_key:
Query
Query
Response