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