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
.