Перейти к основному содержимому
Перейти к основному содержимому

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.

Для вложенной структуры данных не нужно указывать ее колонки в кортеже колонок для суммирования.