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.