OPTIMIZE TABLE ... FINAL (см. документацию), поскольку он предназначен для задач администрирования, а не для повседневной эксплуатации.
OPTIMIZE не может устранить ошибку Too many parts.OPTIMIZE поддерживается для семейства MergeTree (включая materialized views) и движка 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 на неактивных репликах.
Если
alter_sync установлена в 2 и некоторые реплики остаются неактивными дольше времени, заданного настройкой replication_wait_for_inactive_replica_timeout, будет сгенерировано исключение UNFINISHED.DRY RUN
DRY RUN имитирует слияние указанных частей без фиксации результата. Слитая часть записывается во временное место, проверяется, а затем отбрасывается. Исходные части и данные таблицы остаются без изменений.
Это полезно для:
- Проверки корректности слияния в разных версиях ClickHouse.
- Детерминированного воспроизведения ошибок, связанных со слиянием.
- Бенчмаркинга производительности слияния.
DRY RUN поддерживается только для таблиц семейства MergeTree. Обязательно ключевое слово PARTS со списком имён частей. Все указанные части должны существовать, быть активными и принадлежать одной партиции.
DRY RUN несовместим с FINAL и PARTITION. Его можно использовать вместе с DEDUPLICATE (с необязательным указанием столбцов) и CLEANUP (для таблиц ReplacingMergeTree).
Синтаксис
CHECK TABLE. Это поведение управляется настройкой optimize_dry_run_check_part (по умолчанию включена). Если отключить её, проверка будет пропущена, что может быть полезно для бенчмарка самого слияния.
Пример
Выражение BY
*, COLUMNS и EXCEPT. Явно указанный или неявно развёрнутый список столбцов должен включать все столбцы, указанные в выражении упорядочивания строк (и основной ключ, и ключ сортировки), а также в выражении партиционирования (ключ партиционирования).
Обратите внимание, что
* ведёт себя так же, как в SELECT: столбцы MATERIALIZED и ALIAS не используются при развёртывании.Кроме того, указание пустого списка столбцов, запись выражения, которое приводит к пустому списку столбцов, или выполнение дедупликации по столбцу ALIAS считается ошибкой.Query
Query
Query
Response
DEDUPLICATE
Query
Query
Response
DEDUPLICATE BY *
ALIAS и MATERIALIZED. Для приведённой выше таблицы это столбцы primary_key, secondary_key, value и partition_key:
Query
Query
Response
DEDUPLICATE BY * EXCEPT
ALIAS и MATERIALIZED, а также явно исключая value: столбцы primary_key, secondary_key и partition_key.
Query
Query
Response
DEDUPLICATE BY <list of columns>
primary_key, secondary_key и partition_key:
Query
Query
Response
DEDUPLICATE BY COLUMNS(<regex>)
primary_key, secondary_key и partition_key:
Query
Query
Response