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