AggregatingMergeTree можно использовать для инкрементальной агрегации данных, в том числе для агрегированных materialized view.
Ниже в видео показан пример использования AggregatingMergeTree и агрегатных функций:
AggregatingMergeTree целесообразно использовать, если это позволяет уменьшить количество строк на порядки.
Создание таблицы
AggregatingMergeTree требуются те же секции, что и при создании таблицы MergeTree.
SELECT и INSERT
-State.
При выборке данных из таблицы AggregatingMergeTree используйте оператор GROUP BY и те же агрегатные функции, что и при вставке данных, но с суффиксом -Merge.
В результатах запроса SELECT значения типа AggregateFunction имеют зависящее от реализации двоичное представление во всех форматах вывода ClickHouse. Например, если вы выгрузите данные в формат TabSeparated с помощью запроса SELECT, этот дамп можно затем загрузить обратно с помощью запроса INSERT.
Пример агрегированного materialized view
test. Если она ещё не создана, выполните команду ниже:
test.visits, содержащую исходные данные:
AggregatingMergeTree, которая будет хранить AggregationFunctions для отслеживания общего числа посещений и количества уникальных пользователей.
Создайте materialized view AggregatingMergeTree, который отслеживает таблицу test.visits и использует тип AggregateFunction:
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 для каждой отдельной строки создаётся aggregate state без группировки.
Каждая исходная строка создаёт одну строку в materialized view, а фактическая агрегация происходит позже — при
слиянии частей в AggregatingMergeTree. Это верно только при optimize_on_insert = 0.