Выбор ответа Middle ClickHouse и колоночные СУБД спрашивают часто обновлено

ReplacingMergeTree и дубли

Вопрос

Таблица на ReplacingMergeTree(version) с ключом order_id. Сразу после вставки новой версии заказа запрос SELECT count() FROM orders WHERE order_id = 1 вернул 2. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Дедупликация идёт при фоновых слияниях, а не при вставке; для точности нужны FINAL или argMax. Две версии лежат в разных частях, пока их не сольют, а когда это случится, не определено.

Варианты ответа

  1. ReplacingMergeTree не удаляет дубли сам, для этого нужно периодически запускать OPTIMIZE ... DEDUPLICATE
  2. Ключ дедупликации у ReplacingMergeTree задаётся в PARTITION BY, а order_id указан в ORDER BY
  3. Нужно вставлять с параметром replace = 1, иначе движок не сравнивает версии при вставке
  4. Дедупликация идёт при фоновых слияниях, а не при вставке; для точности нужны FINAL или argMaxправильный ответ

Разбор

Две версии лежат в разных частях, пока их не сольют, а когда это случится, не определено. Запросы должны учитывать возможные дубли: FINAL дедуплицирует на лету (дороже), argMax(status, version) ... GROUP BY order_id выбирает последнюю версию. Дедупликацию движок делает сам при слияниях, просто позже, OPTIMIZE для этого не обязателен. Ключом служит ORDER BY. Параметра replace у INSERT нет. Ещё одна тонкость: строки в разных партициях не схлопываются никогда.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.