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

Оператор OPTIMIZE

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

примечание

OPTIMIZE не может исправить ошибку Too many parts.

Синтаксис

Запрос 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-clause) будут дедублированы (все столбцы сравниваются), это имеет смысл только для движка 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. Учитывая таблицу выше, это столбцы 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:

Результат: