Перейти к основному содержимому
Перейти к основному содержимому

optimize

description: 'Документация для Optimize' sidebar_label: 'ОПТИМИЗАЦИЯ' sidebar_position: 47 slug: /sql-reference/statements/optimize title: 'Запрос OPTIMIZE'

Запрос OPTIMIZE поддерживается для семейства MergeTree (включая материализованные представления) и движков Buffer. Другие движки таблиц не поддерживаются.

Когда OPTIMIZE используется с семейством движков таблиц ReplicatedMergeTree, ClickHouse создает задачу для слияния и ждет выполнения на всех репликах (если настройка alter_sync установлена на 2) или на текущей реплике (если настройка alter_sync установлена на 1).

  • Если OPTIMIZE не выполняет слияние по каким-либо причинам, он не уведомляет клиента. Чтобы включить уведомления, используйте настройку optimize_throw_if_noop.
  • Если вы указываете PARTITION, то оптимизируется только указанная.partition. Как установить выражение раздела.
  • Если вы указываете FINAL или FORCE, оптимизация выполняется даже тогда, когда все данные уже находятся в одной части. Вы можете контролировать это поведение с помощью optimize_skip_merged_partitions. Также слияние принудительно, даже если выполняются параллельные слияния.
  • Если вы указываете DEDUPLICATE, то полностью идентичные строки (если не указано выражение by) будут дедуплицированы (все столбцы сравниваются), это имеет смысл только для движка MergeTree.

Вы можете указать, как долго (в секундах) ждать, чтобы неактивные реплики выполняли запросы OPTIMIZE, используя настройку replication_wait_for_inactive_replica_timeout.

примечание

Если alter_sync установлен на 2, и некоторые реплики неактивны более времени, указанного настройкой replication_wait_for_inactive_replica_timeout, то возникает исключение UNFINISHED.

BY expression

Если вы хотите выполнить дедупликацию по пользовательскому набору столбцов, а не по всем, вы можете явно указать список столбцов или использовать любую комбинацию *, COLUMNS или EXCEPT выражений. Явно записанный или неявно расширенный список столбцов должен включать все столбцы, указанные в выражении сортировки строки (как первичных, так и сортировочных ключей), и в выражении разбиения (ключ разбиения).

примечание

Обратите внимание, что * ведет себя так же, как в SELECT: МАТЕРИАЛИЗОВАННЫЙ и АЛИАС столбцы не используются для расширения.

Кроме того, ошибка является указывать пустой список столбцов или писать выражение, которое приводит к пустому списку столбцов, или дедуплицировать по столбцу ALIAS.

Синтаксис

Примеры

Рассмотрим таблицу:

Результат:

Все следующие примеры выполняются против этого состояния с 5 строками.

DEDUPLICATE

Когда столбцы для дедупликации не указаны, все они учитываются. Строка удаляется только в том случае, если все значения во всех столбцах равны соответствующим значениям в предыдущей строке:

Результат:

DEDUPLICATE BY *

Когда столбцы указаны неявно, таблица дедуплицируется по всем столбцам, которые не являются ALIAS или MATERIALIZED. Учитывая таблицу выше, это столбцы primary_key, secondary_key, value и partition_key:

Результат:

DEDUPLICATE BY * EXCEPT

Дедупликация по всем столбцам, которые не являются ALIAS или MATERIALIZED, и явно не value: столбцы primary_key, secondary_key и partition_key.

Результат:

DEDUPLICATE BY <list of columns>

Явная дедупликация по столбцам primary_key, secondary_key и partition_key:

Результат:

DEDUPLICATE BY COLUMNS(<regex>)

Дедупликация по всем столбцам, соответствующим регулярному выражению: столбцы primary_key, secondary_key и partition_key:

Результат: