AggregatingMergeTree
Движок наследуется от MergeTree, изменяя логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) одной строкой (внутри одной части данных), которая хранит комбинацию состояний агрегатных функций.
Вы можете использовать таблицы AggregatingMergeTree
для инкрементной агрегации данных, в том числе для агрегированных материализованных представлений.
Вы можете ознакомиться с примером использования AggregatingMergeTree
и агрегатных функций в приведенном ниже видео:
Движок обрабатывает все колонки со следующими типами:
AggregateFunction
SimpleAggregateFunction
Использование AggregatingMergeTree
уместно, если оно существенно уменьшает количество строк.
Создание таблицы
Для описания параметров запроса смотрите описание запроса.
Клавиши запроса
При создании таблицы AggregatingMergeTree
требуются те же клавиши, что и при создании таблицы MergeTree
.
Устаревший метод создания таблицы
Не используйте этот метод в новых проектах и, по возможности, переключите старые проекты на метод, описанный выше.
Все параметры имеют то же значение, что и в MergeTree
.
SELECT и INSERT
Для вставки данных используйте INSERT SELECT запрос с агрегатными функциями состояния.
При выборе данных из таблицы 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
, который вернет следующий вывод: