Войти Регистрация
Data base

245. Текущий статус подписки без ночного OPTIMIZE FINAL

Средняя

ClickHouse · ClickHouse 26.3.57.12

Okko переносили аналитику на ClickHouse небольшой командой и почти везде поставили ReplacingMergeTree. Чтобы аналитики не писали FINAL, ежедневный DAG в Airflow запускал OPTIMIZE TABLE … FINAL по каждой партиции. На таблицах в миллиарды строк это переписывало их целиком, занимало кластер, и ожидание данных доходило до 8 часов.

Таблица subs — ReplacingMergeTree(version), ORDER BY user_id. Каждое изменение подписки — новая строка с большей version: сменили тариф, поставили на паузу, отменили. Фоновые слияния идут когда придётся, поэтому в таблице лежат и старые версии.

Для каждого пользователя верните user_id, cur_plan и cur_status по последней версии.

В работе: Витрины «текущее состояние» поверх журнала изменений: подписки, статусы заказов, профили.

Как проверяем Движка ClickHouse в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите все верные варианты (одна лишняя отметка допустима). После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
ReplacingMergeTreeargMaxFINALдубли до слияния

Источник: кейс Okko: переезд аналитики на ClickHouse, доклад и статья 2024. Условие пересказано своими словами.

Какие запросы вернут текущий тариф и статус каждого пользователя?

  • max(status) вместо последней версии
  • argMax(…, version) с GROUP BY user_id
  • GROUP BY user_id, plan
  • SELECT … FROM subs FINAL
  • Обычный SELECT, а ночью OPTIMIZE TABLE subs FINAL