optimize
description: 'Документация для Optimize' sidebar_label: 'ОПТИМИЗАЦИЯ' sidebar_position: 47 slug: /sql-reference/statements/optimize title: 'Запрос OPTIMIZE'
Запрос OPTIMIZE
поддерживается для семейства MergeTree (включая материализованные представления) и движков Buffer. Другие движки таблиц не поддерживаются.
Когда OPTIMIZE
используется с семейством движков таблиц ReplicatedMergeTree, ClickHouse создает задачу для слияния и ждет выполнения на всех репликах (если настройка alter_sync установлена на 2
) или на текущей реплике (если настройка alter_sync установлена на 1
).
- Если
OPTIMIZE
не выполняет слияние по каким-либо причинам, он не уведомляет клиента. Чтобы включить уведомления, используйте настройку optimize_throw_if_noop. - Если вы указываете
PARTITION
, то оптимизируется только указанная.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
: МАТЕРИАЛИЗОВАННЫЙ и АЛИАС столбцы не используются для расширения.
Кроме того, ошибка является указывать пустой список столбцов или писать выражение, которое приводит к пустому списку столбцов, или дедуплицировать по столбцу 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
:
Результат: