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

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.mv_visits:

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

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