Skip to main content
Этот движок наследуется от 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.

Агрегация элементов Tuple

Когда включена настройка allow_tuple_element_aggregation, столбцы Tuple рекурсивно разворачиваются в плоскую структуру, так что каждый конечный элемент независимо участвует в агрегации. Это означает, что подстолбцы AggregateFunction или SimpleAggregateFunction внутри Tuple агрегируются в соответствии со своими функциями, как если бы они были столбцами верхнего уровня. Подстолбцы, входящие в Tuple в ключе сортировки, исключаются из агрегации. Неагрегатные подстолбцы обрабатываются как обычные столбцы (сохраняется их первое значение).
Эта настройка неизменяема и должна быть указана при создании таблицы.
total_visits агрегируется функцией sum (100 + 200 = 300), а unique_users — функцией max (max(5, 8) = 8).
Последнее изменение 23 июля 2026 г.