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
, который вернет следующий вывод: