ReplacingMergeTree и дубли
Вопрос
Таблица на ReplacingMergeTree(version) с ключом order_id. Сразу после вставки новой версии заказа запрос SELECT count() FROM orders WHERE order_id = 1 вернул 2. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- ReplacingMergeTree не удаляет дубли сам, для этого нужно периодически запускать OPTIMIZE ... DEDUPLICATE
- Ключ дедупликации у ReplacingMergeTree задаётся в PARTITION BY, а
order_idуказан в ORDER BY - Нужно вставлять с параметром
replace = 1, иначе движок не сравнивает версии при вставке - Дедупликация идёт при фоновых слияниях, а не при вставке; для точности нужны FINAL или argMaxправильный ответ
Разбор
Две версии лежат в разных частях, пока их не сольют, а когда это случится, не определено. Запросы должны учитывать возможные дубли: FINAL дедуплицирует на лету (дороже), argMax(status, version) ... GROUP BY order_id выбирает последнюю версию. Дедупликацию движок делает сам при слияниях, просто позже, OPTIMIZE для этого не обязателен. Ключом служит ORDER BY. Параметра replace у INSERT нет. Ещё одна тонкость: строки в разных партициях не схлопываются никогда.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.