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 и выполните одно из следующих действий:-
Установите настройки таблицы
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 объединит их в одну часть и удалит все строки удаления. -
Вручную выполните
OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP.
Секции запроса
ReplacingMergeTree требуются те же секции, что и при создании таблицы MergeTree.
Дедупликация во время выполнения запроса & FINAL
ORDER BY (применяемых при создании таблицы) как уникальный идентификатор, и сохраняет только строку с наибольшей версией. Однако это обеспечивает лишь отложенную корректность: нет гарантии, что строки будут дедуплицированы, поэтому полагаться на это не следует. В результате запросы могут возвращать неверные результаты, поскольку при их выполнении могут учитываться строки обновления и удаления.
Чтобы получать корректные результаты, пользователям нужно дополнять фоновые слияния дедупликацией во время выполнения запроса и исключением удалённых строк. Это можно сделать с помощью оператора FINAL. Например, рассмотрим следующий пример:
FINAL возвращает неверное число (точный результат зависит от слияний):
FINAL, в том числе о том, как оптимизировать его производительность, см. в нашем подробном руководстве по ReplacingMergeTree.