Движок таблиц AggregatingMergeTree
Движок наследуется от MergeTree и изменяет логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) одной строкой (в пределах одной части данных), которая хранит комбинацию состояний агрегатных функций.
Вы можете использовать таблицы AggregatingMergeTree для инкрементальной агрегации данных, в том числе для материализованных представлений с агрегированными данными.
Пример использования AggregatingMergeTree и агрегатных функций показан в видео ниже:
Движок обрабатывает все столбцы со следующими типами:
Имеет смысл использовать 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 ещё раз — будет выведен следующий результат:
В некоторых случаях вы можете захотеть избежать предварительной агрегации строк во время вставки, чтобы перенести нагрузку агрегации с момента вставки
на момент слияния. Обычно необходимо включать столбцы, которые не участвуют в агрегации, в оператор GROUP BY
в определении материализованного представления, чтобы избежать ошибки. Однако вы можете воспользоваться функцией initializeAggregation
с настройкой optimize_on_insert = 0 (по умолчанию она включена), чтобы добиться этого. Использование GROUP BY
в этом случае больше не требуется:
При использовании initializeAggregation агрегатное состояние создаётся для каждой отдельной строки без группировки.
Каждая исходная строка даёт одну строку в материализованном представлении, а фактическая агрегация происходит позже, когда
AggregatingMergeTree объединяет части. Это верно только в том случае, если optimize_on_insert = 0.