Команда 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>)
Дедупликация по всем колонкам, соответствующим регулярному выражению: колонки первичный_ключ
, вторичный_ключ
и ключ_партиции
:
Результат: