Движок таблицы AggregatingMergeTree
Движок наследуется от MergeTree и изменяет логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым ключом сортировки) одной строкой (в пределах одной части данных), которая хранит комбинацию состояний агрегатных функций.
Вы можете использовать таблицы AggregatingMergeTree для инкрементальной агрегации данных, в том числе для materialized view с агрегированными данными.
Пример использования AggregatingMergeTree и агрегатных функций показан в видео ниже:
Движок обрабатывает все столбцы со следующими типами:
Имеет смысл использовать AggregatingMergeTree, если он уменьшает число строк на несколько порядков.
Создание таблицы
Для описания параметров запроса см. описание запроса.
Части запроса
При создании таблицы AggregatingMergeTree требуются те же части запроса, что и при создании таблицы MergeTree.
Устаревший способ создания таблицы
Не используйте этот способ в новых проектах и по возможности переведите старые проекты на метод, описанный выше.
Все параметры имеют то же значение, что и в MergeTree.
SELECT и INSERT
Для вставки данных используйте запрос INSERT SELECT с агрегатными функциями с суффиксом -State.
При выборке данных из таблицы AggregatingMergeTree используйте предложение GROUP BY и те же агрегатные функции, что и при вставке данных, но с суффиксом -Merge.
В результатах запроса SELECT значения типа AggregateFunction имеют двоичное представление, зависящее от реализации, для всех форматов вывода ClickHouse. Например, если вы выгружаете данные в формате TabSeparated с помощью запроса SELECT, то этот дамп можно загрузить обратно с помощью запроса INSERT.
Пример агрегированного materialized view
В этом примере предполагается, что у вас есть база данных под названием test. Создайте её, если она ещё не существует, с помощью приведённой ниже команды:
Теперь создайте таблицу test.visits, которая содержит сырые данные:
Далее необходимо создать таблицу AggregatingMergeTree, которая будет хранить агрегатные функции AggregationFunction, отслеживающие общее количество посещений и количество уникальных пользователей.
Создайте materialized view с движком AggregatingMergeTree, которое отслеживает таблицу test.visits и использует тип AggregateFunction:
Создайте materialized view, которое заполняет таблицу test.agg_visits данными из test.visits:
Добавьте данные в таблицу test.visits:
Данные вставляются как в test.visits, так и в test.agg_visits.
Чтобы получить агрегированные данные, выполните запрос вида SELECT ... GROUP BY ... к materialized view test.visits_mv:
Добавьте ещё пару записей в test.visits, но на этот раз попробуйте использовать другое значение временной метки для одной из записей:
Выполните запрос SELECT ещё раз — будет выведен следующий результат:
В некоторых случаях вы можете захотеть избежать предварительной агрегации строк во время вставки, чтобы перенести нагрузку агрегации с момента вставки
на момент слияния. Обычно необходимо включать столбцы, которые не участвуют в агрегации, в оператор GROUP BY
в определении materialized view, чтобы избежать ошибки. Однако вы можете воспользоваться функцией initializeAggregation
с настройкой optimize_on_insert = 0 (по умолчанию она включена), чтобы добиться этого. Использование GROUP BY
в этом случае больше не требуется:
При использовании initializeAggregation состояние агрегации создаётся для каждой отдельной строки без группировки.
Каждая исходная строка создаёт одну строку в materialized view, а фактическая агрегация происходит позже, когда
AggregatingMergeTree объединяет части. Это верно только при optimize_on_insert = 0.