Вопрос проверяет понимание принципов работы основных движков таблиц ClickHouse и их влияния на производительность запросов.
MergeTree — это основной движок таблиц в ClickHouse, предназначенный для высокопроизводительной аналитики. Данные в нём физически разбиваются на части (parts), каждая из которых отсортирована по ключу сортировки (ORDER BY). При вставке новые данные попадают в отдельную часть, а в фоне происходит слияние (merge) мелких частей в более крупные. Это позволяет эффективно сжимать данные и ускорять запросы за счёт использования первичного индекса.
Этот движок расширяет MergeTree возможностью удалять дубликаты. Если в таблицу попадают строки с одинаковым значением ключа сортировки, то при слиянии остаётся только последняя версия (по времени вставки или по указанному столбцу версии). Это удобно для хранения последних состояний объектов, например, текущих цен или статусов заказов.
CREATE TABLE prices (
product_id UInt32,
price Float64,
updated_at DateTime
) ENGINE = ReplacingMergeTree(updated_at)
ORDER BY product_id;
INSERT INTO prices VALUES (1, 100, now());
INSERT INTO prices VALUES (1, 110, now() + 10);
-- После слияния останется строка с ценой 110Движок автоматически суммирует числовые столбцы для строк с одинаковым ключом сортировки. Это идеально подходит для агрегации событий, например, подсчёта просмотров страниц или сумм продаж по дням. Суммирование происходит только во время слияния, поэтому для получения точных данных может потребоваться дополнительная агрегация в запросе.
CREATE TABLE page_views (
date Date,
page_id UInt32,
views UInt64
) ENGINE = SummingMergeTree()
ORDER BY (date, page_id);
INSERT INTO page_views VALUES ('2023-01-01', 1, 10);
INSERT INTO page_views VALUES ('2023-01-01', 1, 5);
-- После слияния: (2023-01-01, 1, 15)Вывод: MergeTree — универсальный выбор для аналитики, ReplacingMergeTree — для дедупликации, SummingMergeTree — для предварительной агрегации. Выбор движка зависит от характера данных и требований к запросам.