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