Разделите исходную историю, актуальные версии карточек и отзывов, затем отчётный слой. Не стройте каждый отчёт полным join всех 600 млн карточек.
[имя] спросил: кейс: в ClickHouse ежедневно грузится ~4 млн отзывов (ID отзыва, ID карточки, дата создания, дата изменения) и ~100-600 тыс. записей карточек (ID карточки, ID общей карточки, ID продавца), всего ~600 млн карточек, из них 70 млн с отзывами.
Разделите исходную историю, актуальные версии карточек и отзывов, затем отчётный слой. Не стройте каждый отчёт полным join всех 600 млн карточек.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
[имя] спросил: кейс: в ClickHouse ежедневно грузится ~4 млн отзывов (ID отзыва, ID карточки, дата создания, дата изменения) и ~100-600 тыс. записей карточек (ID карточки, ID общей карточки, ID продавца), всего ~600 млн карточек, из них 70 млн с отзывами. Нужно организовать быструю загрузку данных и построение отчётности с join этих двух таблиц в разрезе общей карточки и продавца. Какую архитектуру, движки таблиц, первичные ключи и подход к join'у вы бы предложили?
Ответ
Разделите исходную историю, актуальные версии карточек и отзывов, затем отчётный слой. Не стройте каждый отчёт полным join всех 600 млн карточек.
Исходные изменения сохраняйте append-only с идентификатором и версией, загружая крупными пакетами. Для текущего состояния возможен ReplacingMergeTree(version): ORDER BY должен идентифицировать сущность стабильными полями; меняющиеся seller_id и common_card_id нельзя бездумно включать в ключ дедупликации. До merge актуальность обеспечивается явно.
Фильтруйте отзывы по отчётному диапазону, заранее сокращайте набор нужных card_id и выбирайте join по измерениям памяти и профилю запросов. Словарь допустим только для набора подходящего размера, не автоматически для всех 600 млн строк. Для частых отчётов полезна обогащённая витрина и пересчёт затронутых агрегатов. Изменение карточки не исправляет ранее записанные результаты обычной insert-trigger MV само по себе; заранее определите, нужны атрибуты на момент отзыва или текущие.