♻️ ReplacingMergeTree — когда в ClickHouse всё-таки нужны обновления

🔥 Главная мысль

ClickHouse не любит классические UPDATE.

Но это не значит, что в нём вообще нельзя моделировать изменение данных.

Один из самых частых способов — ReplacingMergeTree.

Если сказать совсем просто:

ReplacingMergeTree позволяет хранить несколько версий строки, а потом во время merge оставлять только одну — обычно последнюю или с наибольшей версией.

🟢 Плюсы:

• подходит для дедупликации • помогает моделировать обновления через перевставку • удобно хранить “актуальную” версию данных • можно использовать версионность

Пример плюса: если у тебя есть справочник клиентов, и по одному client_id иногда приезжают новые версии строки, ReplacingMergeTree позволяет в итоге оставить последнюю версию.

🔴 Минусы:

• дубликаты исчезают не сразу • merge идёт в фоне • при чтении без FINAL дубликаты могут быть видны • люди часто ждут от него “мгновенный UPDATE”, а это не так

Пример минуса: ты вставил новую версию записи и сделал SELECT, а старая запись ещё видна. Это нормально для ReplacingMergeTree, потому что merge мог ещё не успеть выполниться.

🧪 Живые примеры

Когда ReplacingMergeTree особенно уместен:

• дедупликация событий • актуальные справочники • CDC-сценарии • модель “пришла новая версия строки”

Когда он не идеален:

• если тебе нужен мгновенно консистентный результат без FINAL • если ты хочешь классическое поведение OLTP UPDATE • если объём дублей и нагрузка на FINAL становятся слишком большими

Простой сценарий:

вместо того чтобы делать UPDATE по строке, ты просто вставляешь новую версию записи.

Для ClickHouse это естественнее, чем переписывать старую строку “по месту”.

🏗 Архитектурная мысль

В больших компаниях ReplacingMergeTree часто используют как компромисс:

не делать тяжёлые UPDATE, а моделировать изменение данных через append-only вставки новых версий.

Что это даёт:

• лучше соответствует природе ClickHouse • проще грузить данные батчами • удобно для CDC и исторических потоков

⚠️ Риски:

• злоупотреблять FINAL • забыть про версионность • ожидать мгновенного удаления дублей • не учитывать стоимость чтения в “сыром” состоянии

Самая частая ошибка — ожидать от ReplacingMergeTree поведения обычной транзакционной БД.

✅ Вывод

ReplacingMergeTree — это не “обычный UPDATE в ClickHouse” ♻️

Это способ моделировать обновления через новые версии строк.

Для дедупликации и CDC это очень полезно. Для классической транзакционной логики — уже не лучший путь ⚡️

♻️ ReplacingMergeTree — когда в ClickHouse всё-таки нужны обновления
🔥 Главная мысль
ClickHouse не любит классические UPDATE.
Но это не значит,
что в нём вообще нельзя моделировать изменение данных | Сетка — социальная сеть от hh.ru