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
.
Для вложенной структуры данных вам не нужно указывать ее столбцы в кортеже столбцов для суммирования.