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

AggregatingMergeTree

Движок наследует от MergeTree, изменяя логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с тем же ключом сортировки) на одну строку (в пределах одной части данных), которая хранит комбинацию состояний агрегатных функций.

Вы можете использовать таблицы AggregatingMergeTree для инкрементной агрегации данных, включая агрегированные материализованные представления.

Вы можете увидеть пример того, как использовать AggregatingMergeTree и агрегатные функции в приведённом ниже видео:

Движок обрабатывает все колонки со следующими типами:

AggregateFunction

SimpleAggregateFunction

Использование AggregatingMergeTree оправдано, если оно уменьшает количество строк на порядок.

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

Для описания параметров запроса смотрите описание запроса.

Клаузы запросов

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

Устаревший метод создания таблицы
примечание

Не используйте этот метод в новых проектах и, если возможно, переключите старые проекты на описанный выше метод.

Все параметры имеют то же значение, что и в MergeTree.

SELECT и INSERT

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

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

Пример агрегированного материализованного представления

В следующем примере предполагается, что у вас есть база данных с именем test, поэтому создайте её, если она ещё не существует:

Теперь создайте таблицу test.visits, которая содержит необработанные данные:

Затем вам нужна таблица AggregatingMergeTree, которая будет хранить AggregationFunction, отслеживающие общее количество посещений и количество уникальных пользователей.

Создайте материализованное представление AggregatingMergeTree, которое будет следить за таблицей test.visits и использовать тип AggregateFunction:

Создайте материализованное представление, которое заполняет test.agg_visits из test.visits:

Вставьте данные в таблицу test.visits:

Данные вставляются как в test.visits, так и в test.agg_visits.

Чтобы получить агрегированные данные, выполните запрос, например, SELECT ... GROUP BY ... из материализованного представления test.visits_mv:

Добавьте ещё несколько записей в test.visits, но на этот раз попробуйте использовать другую метку времени для одной из записей:

Снова запустите запрос SELECT, который вернет следующий результат: