SummingMergeTree
Движок наследует от MergeTree. Разница в том, что при слиянии частей данных в таблицах SummingMergeTree ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) на одну строку, которая содержит суммированные значения для колонок с числовым типом данных. Если ключ сортировки составлен таким образом, что одно значение ключа соответствует большому числу строк, это значительно уменьшает объем хранения и ускоряет выборку данных.
Мы рекомендуем использовать этот движок вместе с MergeTree. Храните полные данные в таблице MergeTree, а используйте SummingMergeTree для хранения агрегированных данных, например, при подготовке отчетов. Такой подход позволит избежать потери ценных данных из-за неправильно составленного первичного ключа.
Создание таблицы
Для описания параметров запроса смотрите описание запроса.
Параметры SummingMergeTree
columns
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.
Для вложенной структуры данных вам не нужно указывать ее колонки в кортеже колонок для суммирования.