Skip to main content
Этот движок отличается от MergeTree тем, что удаляет повторяющиеся записи с одинаковым значением ключа сортировки (раздел таблицы ORDER BY, а не PRIMARY KEY). Дедупликация данных происходит только во время слияния. Слияние выполняется в фоновом режиме в непредсказуемый момент, поэтому заранее рассчитывать на него нельзя. Часть данных может остаться необработанной. Хотя вы можете запустить внеплановое слияние с помощью запроса OPTIMIZE, полагаться на это не стоит, поскольку запрос OPTIMIZE считывает и записывает большой объем данных. Таким образом, ReplacingMergeTree подходит для фонового удаления дубликатов ради экономии места, но не гарантирует полного отсутствия дубликатов.
Подробное руководство по ReplacingMergeTree, включая рекомендации и способы оптимизации производительности, доступно здесь.

Создание таблицы

Описание параметров запроса см. в разделе описание оператора.
Уникальность строк определяется разделом таблицы ORDER BY, а не PRIMARY KEY.

Параметры ReplacingMergeTree

ver

ver — столбец с номером версии. Тип: UInt*, Date, DateTime или DateTime64. Необязательный параметр. При слиянии ReplacingMergeTree из всех строк с одинаковым ключом сортировки оставляет только одну:
  • Последнюю в выборке, если ver не задан. Выборка — это набор строк из набора частей, участвующих в слиянии. Последней в выборке будет строка из самой недавно созданной части (то есть из последней вставки). Таким образом, после дедупликации для каждого уникального ключа сортировки останется самая последняя строка из самой недавней вставки.
  • С максимальной версией, если указан ver. Если ver одинаков для нескольких строк, то для них будет применяться правило «если ver не задан», то есть останется строка, вставленная последней.
Пример:

is_deleted

is_deleted — имя столбца, используемого при слиянии для определения того, представляет ли данные в этой строке состояние или строка должна быть удалена; 1 — это строка “удалена”, 0 — строка “состояние”. Тип данных столбца — UInt8.
is_deleted можно включить только при использовании ver.Независимо от операции с данными, версию следует увеличивать. Если две вставленные строки имеют одинаковый номер версии, сохраняется последняя вставленная строка.По умолчанию ClickHouse сохраняет последнюю строку для ключа, даже если это строка удаления. Это сделано для того, чтобы любые будущие строки с меньшими версиями можно было безопасно вставлять, и строка удаления всё равно применялась.Чтобы навсегда удалить такие строки удаления, включите настройку таблицы allow_experimental_replacing_merge_with_cleanup и выполните одно из следующих действий:
  1. Установите настройки таблицы enable_replacing_merge_with_cleanup_for_min_age_to_force_merge, min_age_to_force_merge_on_partition_only и min_age_to_force_merge_seconds. Если все части в партиции старше min_age_to_force_merge_seconds, ClickHouse объединит их в одну часть и удалит все строки удаления.
  2. Вручную выполните OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP.
Пример:

Секции запроса

При создании таблицы ReplacingMergeTree требуются те же секции, что и при создании таблицы MergeTree.

Дедупликация во время выполнения запроса & FINAL

Во время слияния ReplacingMergeTree выявляет повторяющиеся строки, используя значения столбцов ORDER BY (применяемых при создании таблицы) как уникальный идентификатор, и сохраняет только строку с наибольшей версией. Однако это обеспечивает лишь отложенную корректность: нет гарантии, что строки будут дедуплицированы, поэтому полагаться на это не следует. В результате запросы могут возвращать неверные результаты, поскольку при их выполнении могут учитываться строки обновления и удаления. Чтобы получать корректные результаты, пользователям нужно дополнять фоновые слияния дедупликацией во время выполнения запроса и исключением удалённых строк. Это можно сделать с помощью оператора FINAL. Например, рассмотрим следующий пример:
Запрос без FINAL возвращает неверное число (точный результат зависит от слияний):
При добавлении FINAL получается правильный результат:
Более подробную информацию о FINAL, в том числе о том, как оптимизировать его производительность, см. в нашем подробном руководстве по ReplacingMergeTree.
Последнее изменение 23 июля 2026 г.