Skip to main content
Skip to main content

OPTIMIZE

Запрос пытается запустить внеплановое слияние кусков данных для таблиц.

Внимание

OPTIMIZE не устраняет причину появления ошибки Too many parts.

Синтаксис

Может применяться к таблицам семейства MergeTree, MaterializedView и Buffer. Другие движки таблиц не поддерживаются.

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

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

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

Примечание

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

Выражение BY

Чтобы выполнить дедупликацию по произвольному набору столбцов, вы можете явно указать список столбцов или использовать любую комбинацию подстановки *, выражений COLUMNS и EXCEPT.

Список столбцов для дедупликации должен включать все столбцы, указанные в условиях сортировки (первичный ключ и ключ сортировки), а также в условиях партиционирования (ключ партиционирования).

Примечание

Обратите внимание, что символ подстановки * обрабатывается так же, как и в запросах SELECT: столбцы MATERIALIZED и ALIAS не включаются в результат. Если указать пустой список или выражение, которое возвращает пустой список, то сервер вернет ошибку. Запрос вида DEDUPLICATE BY aliased_value также вернет ошибку.

Синтаксис

Примеры

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

Результат:

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

Результат:

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

Результат:

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

Результат:

Дедупликация по столбцам primary_key, secondary_key и partition_key.

Результат:

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

Результат: