Перейти к основному содержимому
Перейти к основному содержимому

ReplacingMergeTree

Данный движок отличается от 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.

Строка удаляется только при выполнении OPTIMIZE ... FINAL CLEANUP. Это специальное ключевое слово CLEANUP не разрешено по умолчанию, если настройка allow_experimental_replacing_merge_with_cleanup для MergeTree не включена.

Несмотря на операцию с данными, версия должна быть увеличена. Если две вставленные строки имеют одинаковый номер версии, то сохраняется последняя вставленная строка.

Пример:

Условия запроса

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

Устаревший способ создания таблицы
примечание

Не используйте этот способ в новых проектах и, если возможно, переключите старые проекты на описанный выше метод.

Все параметры, кроме ver, имеют то же значение, что и в MergeTree.

  • ver - колонка с версией. Опциональный параметр. Для описания смотрите текст выше.

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

Во время слияния ReplacingMergeTree выявляет дублирующиеся строки, используя значения колонок ORDER BY (используемые для создания таблицы) в качестве уникального идентификатора и сохраняет только наивысшую версию. Однако это обеспечивает только конечную корректность - это не гарантирует, что строки будут дедуплицированы, и вы не должны на это полагаться. Запросы могут, следовательно, давать неверные ответы из-за обновления и удаления строк, учитываемых в запросах.

Чтобы получить правильные ответы, пользователям необходимо дополнить фоновые слияния дедупликацией и удалением строк на этапе запроса. Это можно сделать с помощью оператора FINAL. Например, рассмотрим следующий пример:

Запрос без FINAL дает неправильное количество (точный результат будет варьироваться в зависимости от слияний):

Добавление FINAL дает правильный результат:

Для получения дополнительной информации о FINAL, включая оптимизацию его производительности, мы рекомендуем прочитать наше подробное руководство по ReplacingMergeTree.