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