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 по последней версии.
В работе: Витрины «текущее состояние» поверх журнала изменений: подписки, статусы заказов, профили.
Источник: кейс 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