Перейти к основному содержанию
Этот движок наследуется от MergeTree, изменяя логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) одной строкой (в пределах одной части данных), которая хранит комбинацию состояний агрегатных функций. Таблицы AggregatingMergeTree можно использовать для инкрементальной агрегации данных, в том числе для агрегированных materialized view. Ниже в видео показан пример использования AggregatingMergeTree и агрегатных функций:
Движок обрабатывает все столбцы следующих типов: AggregatingMergeTree целесообразно использовать, если это позволяет уменьшить количество строк на порядки.

Создание таблицы

Описание параметров запроса см. в разделе описание запроса. Секции запроса При создании таблицы AggregatingMergeTree требуются те же секции, что и при создании таблицы MergeTree.

SELECT и INSERT

Чтобы вставить данные, используйте запрос INSERT SELECT с агрегатными функциями со суффиксом -State. При выборке данных из таблицы AggregatingMergeTree используйте оператор GROUP BY и те же агрегатные функции, что и при вставке данных, но с суффиксом -Merge. В результатах запроса SELECT значения типа AggregateFunction имеют зависящее от реализации двоичное представление во всех форматах вывода ClickHouse. Например, если вы выгрузите данные в формат TabSeparated с помощью запроса SELECT, этот дамп можно затем загрузить обратно с помощью запроса INSERT.

Пример агрегированного materialized view

В следующем примере предполагается, что у вас есть база данных с именем test. Если она ещё не создана, выполните команду ниже:
Теперь создайте таблицу test.visits, содержащую исходные данные:
Далее необходимо создать таблицу AggregatingMergeTree, которая будет хранить AggregationFunctions для отслеживания общего числа посещений и количества уникальных пользователей. Создайте materialized view AggregatingMergeTree, который отслеживает таблицу test.visits и использует тип AggregateFunction:
Создайте materialized view, который заполняет test.agg_visits данными из test.visits:
Вставьте данные в таблицу test.visits:
Данные вставляются в обе таблицы: test.visits и test.agg_visits. Чтобы получить агрегированные данные, выполните запрос вида SELECT ... GROUP BY ... из materialized view test.visits_mv:
Добавьте ещё несколько записей в test.visits, но на этот раз укажите другую временную метку для одной из записей:
Выполните запрос SELECT ещё раз — он вернёт следующий результат:
В некоторых случаях может потребоваться избежать предварительной агрегации строк при вставке, чтобы перенести затраты на агрегацию с момента вставки на момент слияния. Как правило, чтобы избежать ошибки, необходимо включать в конструкцию GROUP BY определения materialized view те столбцы, которые не участвуют в агрегации. Однако этого можно добиться с помощью функции initializeAggregation и параметра optimize_on_insert = 0 (по умолчанию он включён). В таком случае использование GROUP BY больше не требуется:
При использовании initializeAggregation для каждой отдельной строки создаётся aggregate state без группировки. Каждая исходная строка создаёт одну строку в materialized view, а фактическая агрегация происходит позже — при слиянии частей в AggregatingMergeTree. Это верно только при optimize_on_insert = 0.
Последнее изменение 19 июня 2026 г.