Ответ вслух Senior ClickHouse и колоночные СУБД обновлено

Последнее состояние сущности в ClickHouse

Вопрос

Нужно хранить в ClickHouse текущий статус заказов, статусы меняются много раз. Как это сделать и какие подводные камни?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Образцовый ответ: «Обновления в ClickHouse делаются вставкой новой версии строки. Беру ReplacingMergeTree с колонкой версии, например updatedat или монотонный номер, и ORDER BY по orderid.

Что должно прозвучать в ответе

  • Модель вставки новых версий вместо UPDATE

  • ReplacingMergeTree(version) с ORDER BY по ключу заказа

  • Дедупликация только при слияниях: в запросах FINAL или argMax

  • Версии в разных партициях не схлопываются: партиционирование по неизменному полю

  • Удаления через флаг is_deleted (поддерживается в ReplacingMergeTree)

  • Альтернативы: CollapsingMergeTree, хранение истории и витрина

Что могут спросить следом

  • Что быстрее: FINAL или argMax?
  • Как удалить заказ?

Разбор

Образцовый ответ: «Обновления в ClickHouse делаются вставкой новой версии строки. Беру ReplacingMergeTree с колонкой версии, например updated_at или монотонный номер, и ORDER BY по order_id. При слияниях остаётся строка с максимальной версией, но слияния происходят когда-нибудь, поэтому запросы обязаны учитывать дубли: SELECT FINAL или argMax(status, version) с группировкой по order_id. Важная тонкость: строки схлопываются только внутри одной партиции, поэтому партиционировать надо по полю, которое у заказа не меняется, например по дате создания, а не по дате изменения. Для удаления есть колонка-признак удаления в ReplacingMergeTree. Если нужна и история, храню все версии в обычной таблице, а текущее состояние строю отдельно».

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

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