Какие движки ClickHouse используются и известны
Что проверяют
Понимаете ли вы, что в ClickHouse движок таблицы определяет, как данные хранятся, сливаются и реплицируются, а не просто «формат файла». Следом почти всегда спрашивают, почему в ReplacingMergeTree всё равно видны дубли и как с этим жить.
Как отвечать
Основа всего это семейство MergeTree. Данные пишутся кусками (parts), отсортированными по ORDER BY, и фоновые слияния объединяют их. Разреженный первичный индекс строится по ключу сортировки, по умолчанию одна метка на 8192 строки, а PARTITION BY режет данные на партиции, которые удобно удалять целиком.
- MergeTree: базовый движок для сырых событий и логов;
- ReplacingMergeTree: при слиянии оставляет одну строку на ключ сортировки, опционально по колонке версии. Дедупликация отложенная, для точного результата нужен
FINALилиargMaxв запросе; - SummingMergeTree: при слиянии суммирует числовые колонки строк с одинаковым ключом;
- AggregatingMergeTree: хранит промежуточные состояния агрегатных функций (комбинатор
-State), читаются они через-Merge. Обычно наполняется материализованным представлением; - CollapsingMergeTree и VersionedCollapsingMergeTree: удаление и изменение через пару строк с колонкой
signсо значениями1и-1, второй движок терпит вставку не по порядку; - Replicated-варианты: те же движки с репликацией через ClickHouse Keeper или ZooKeeper.
Вне MergeTree стоит назвать Distributed (сам данные не хранит, раскидывает запросы по шардам), Log и TinyLog для мелких временных таблиц, Memory, Buffer, интеграционные Kafka, PostgreSQL, S3 и служебные Dictionary и Null.
Где спотыкаются
Считают, что ReplacingMergeTree гарантирует уникальность. Слияние происходит когда угодно или не происходит вовсе, и без FINAL запрос вернёт дубли.
Выбирают ключ сортировки не по фильтрам запросов. Если в WHERE чаще всего дата и клиент, а в ORDER BY стоит идентификатор события, индекс почти не помогает.
Делают слишком мелкие партиции, например по часу или по клиенту, и вставляют по одной строке. Тысячи кусков дают ошибку «Too many parts», вставлять нужно пачками.