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

Команда OPTIMIZE

Этот запрос пытается инициировать несогласовываемое слияние частей данных для таблиц. Обратите внимание, что мы обычно не рекомендуем использовать OPTIMIZE TABLE ... FINAL (см. эти документы), поскольку его область применения предназначена для администрирования, а не для повседневной работы.

примечание

OPTIMIZE не может исправить ошибку Слишком много частей.

Синтаксис

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

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

  • Если OPTIMIZE не выполняет слияние по какой-либо причине, он не уведомляет клиента. Чтобы включить уведомления, используйте настройку optimize_throw_if_noop.
  • Если вы укажете 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: колонки MATERIALIZED и ALIAS не используются для расширения.

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

Синтаксис

Примеры

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

Результат:

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

DEDUPLICATE

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

Результат:

DEDUPLICATE BY *

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

Результат:

DEDUPLICATE BY * EXCEPT

Дедупликация по всем колонкам, которые не являются ALIAS или MATERIALIZED, и явно не являются значение: колонки первичный_ключ, вторичный_ключ и ключ_партиции.

Результат:

DEDUPLICATE BY <список колонок>

Явная дедупликация по колонкам первичный_ключ, вторичный_ключ и ключ_партиции:

Результат:

DEDUPLICATE BY COLUMNS(<regex>)

Дедупликация по всем колонкам, соответствующим регулярному выражению: колонки первичный_ключ, вторичный_ключ и ключ_партиции:

Результат: