Команда OPTIMIZE
Этот запрос пытается инициировать внеплановое слияние частей данных таблиц. Обратите внимание, что в целом мы не рекомендуем использовать OPTIMIZE TABLE ... FINAL (см. документацию), поскольку эта команда предназначена для административных задач, а не для повседневных операций.
OPTIMIZE не может исправить ошибку Too many parts.
Синтаксис
Запрос OPTIMIZE поддерживается для семейства MergeTree (включая materialized views) и движка Buffer. Другие табличные движки OPTIMIZE не поддерживают.
Когда 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
Если вы хотите выполнять дедупликацию по произвольному набору столбцов, а не по всем, вы можете явно указать список столбцов или использовать любую комбинацию выражений *, 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:
Результат: