Движок таблиц SummingMergeTree
Этот движок наследуется от MergeTree. Разница в том, что при слиянии частей данных для таблиц SummingMergeTree ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) одной строкой, которая содержит суммы значений для столбцов с числовым типом данных. Если ключ сортировки построен таким образом, что одному значению ключа соответствует большое количество строк, это существенно уменьшает объем хранимых данных и ускоряет выборку.
Мы рекомендуем использовать этот движок совместно с MergeTree. Храните полные данные в таблице MergeTree, а SummingMergeTree используйте для хранения агрегированных данных, например при подготовке отчетов. Такой подход поможет избежать потери ценных данных из-за некорректно составленного первичного ключа.
Создание таблицы
Описание параметров запроса см. в описании запроса.
Параметры SummingMergeTree
Столбцы
columns — кортеж с именами столбцов, значения в которых будут суммироваться. Необязательный параметр.
Столбцы должны иметь числовой тип и не должны входить в ключ партиционирования или сортировки.
Если columns не указан, ClickHouse суммирует значения во всех столбцах с числовым типом данных, которые не входят в ключ сортировки.
Части запроса
При создании таблицы SummingMergeTree требуются те же части запроса, что и при создании таблицы MergeTree.
Устаревший метод создания таблицы
Не используйте этот метод в новых проектах и, по возможности, переведите старые проекты на метод, описанный выше.
Все параметры, кроме columns, имеют то же значение, что и в MergeTree.
columns— кортеж с именами столбцов, значения которых будут суммироваться. Необязательный параметр. Описание см. в тексте выше.
Пример использования
Рассмотрим следующую таблицу:
Запишите в неё данные:
ClickHouse может суммировать строки не полностью (см. ниже), поэтому в запросе мы используем агрегатную функцию sum и предложение GROUP BY.
Обработка данных
Когда данные вставляются в таблицу, они сохраняются как есть. ClickHouse периодически сливает вставленные части данных, и именно в этот момент строки с одинаковым первичным ключом суммируются и заменяются одной строкой для каждой получившейся части данных.
ClickHouse может сливать части данных таким образом, что разные получившиеся части данных могут содержать строки с одинаковым первичным ключом, т. е. суммирование будет неполным. Поэтому при выполнении запроса (SELECT) следует использовать агрегатную функцию sum() и предложение GROUP BY, как описано в примере выше.
Общие правила суммирования
Значения в столбцах с числовым типом данных суммируются. Набор столбцов определяется параметром columns.
Если значения были равны 0 во всех столбцах для суммирования, строка удаляется.
Если столбец не входит в первичный ключ и не суммируется, из существующих значений выбирается произвольное.
Значения не суммируются для столбцов, входящих в первичный ключ.
Суммирование в столбцах AggregateFunction
Для столбцов типа AggregateFunction ClickHouse ведёт себя как движок AggregatingMergeTree, агрегируя в соответствии с функцией.
Вложенные структуры
Таблица может содержать вложенные структуры данных, которые обрабатываются особым образом.
Если имя вложенной таблицы оканчивается на Map и она содержит как минимум два столбца, удовлетворяющих следующим критериям:
- первый столбец — числовой
(*Int*, Date, DateTime)или строковый(String, FixedString), назовём егоkey, - остальные столбцы — арифметические
(*Int*, Float32/64), назовём их(values...),
то такая вложенная таблица интерпретируется как отображение key => (values...), и при слиянии её строк элементы двух наборов данных объединяются по key с суммированием соответствующих (values...).
Примеры:
При запросе данных используйте функцию sumMap(key, value) для агрегации значений типа Map.
Для вложенных структур данных не нужно указывать их столбцы в кортеже столбцов для суммирования.