2018-10-19 11:25:22 +00:00
2017-12-11 12:07:26 +00:00
# AggregatingMergeTree
2017-03-12 17:58:51 +00:00
2018-12-12 17:28:00 +00:00
Движок наследует функциональность [MergeTree ](mergetree.md#table_engines-mergetree ), изменяя логику слияния кусков данных. В с е строки с одинаковым первичным ключом (точнее, с одинаковым [ключом сортировки ](mergetree.md )) ClickHouse заменяет на одну (в пределах одного куска данных), которая хранит объединение состояний агрегатных функций.
2018-10-19 11:25:22 +00:00
Таблицы типа `AggregatingMergeTree` могут использоваться для инкрементальной агрегации данных, в том числе, для агрегирующих материализованных представлений.
2017-03-12 17:58:51 +00:00
2018-12-12 17:28:00 +00:00
Движок обрабатывает все столбцы типа [AggregateFunction ](../../data_types/nested_data_structures/aggregatefunction.md ).
2018-01-19 14:36:40 +00:00
2018-10-19 11:25:22 +00:00
Использование `AggregatingMergeTree` оправдано только в том случае, когда это уменьшает количество строк на порядки.
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
## Создание таблицы
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
```
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
2017-10-25 05:27:09 +00:00
(
2018-10-19 11:25:22 +00:00
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = AggregatingMergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
2017-10-25 05:27:09 +00:00
```
2017-03-12 17:58:51 +00:00
2018-12-12 17:28:00 +00:00
Описание параметров запроса смотрите в [описании запроса ](../../query_language/create.md ).
2018-01-19 14:36:40 +00:00
2018-10-19 11:25:22 +00:00
**Секции запроса**
2017-03-12 17:58:51 +00:00
2018-12-12 17:28:00 +00:00
При создании таблицы `AggregatingMergeTree` используются те же [секции ](mergetree.md ), что и при создании таблицы `MergeTree` .
2018-01-19 14:36:40 +00:00
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
< details markdown = "1" > < summary > Устаревший способ создания таблицы< / summary >
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
!!! attention
Н е используйте этот способ в новых проектах и по возможности переведите старые проекты на способ описанный выше.
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
```sql
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE [=] AggregatingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity)
2017-10-25 05:27:09 +00:00
```
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
В с е параметры имеют то же значение, что в и `MergeTree` .
< / details >
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
## SELECT/INSERT данных
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
Для вставки данных используйте `INSERT SELECT` с агрегатными `-State` -функциями.
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
При выборке данных из таблицы `AggregatingMergeTree` , используйте `GROUP BY` и те же агрегатные функции, что и при вставке данных, но с суффиксом `-Merge` .
В запросах `SELECT` значения типа `AggregateFunction` выводятся во всех форматах, которые поддерживает ClickHouse, в виде implementation-specific бинарных данных. Если с помощью `SELECT` выполнить дамп данных, например, в формат `TabSeparated` , то потом этот дамп можно загрузить обратно с помощью запроса `INSERT` .
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
## Пример агрегирущего материализованного представления
2018-01-19 14:36:40 +00:00
Создаём материализованное представление типа `AggregatingMergeTree` , следящее за таблицей `test.visits` :
2017-03-12 17:58:51 +00:00
2018-10-16 10:47:17 +00:00
``` sql
2017-10-25 05:27:09 +00:00
CREATE MATERIALIZED VIEW test.basic
2018-10-19 11:25:22 +00:00
ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate)
2017-10-25 05:27:09 +00:00
AS SELECT
CounterID,
StartDate,
sumState(Sign) AS Visits,
uniqState(UserID) AS Users
FROM test.visits
GROUP BY CounterID, StartDate;
```
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
Вставляем данные в таблицу `test.visits` :
2017-03-12 17:58:51 +00:00
2018-10-16 10:47:17 +00:00
``` sql
2017-10-25 05:27:09 +00:00
INSERT INTO test.visits ...
```
2017-03-12 17:58:51 +00:00
2018-10-19 11:25:22 +00:00
Данные окажутся и в таблице и в представлении `test.basic` , которое выполнит агрегацию.
Чтобы получить агрегированные данные, выполним запрос вида `SELECT ... GROUP BY ...` из представления `test.basic` :
2017-03-12 17:58:51 +00:00
2018-10-16 10:47:17 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT
StartDate,
sumMerge(Visits) AS Visits,
uniqMerge(Users) AS Users
FROM test.basic
GROUP BY StartDate
ORDER BY StartDate;
```
2017-03-12 17:58:51 +00:00
2018-10-16 10:47:17 +00:00
[Оригинальная статья ](https://clickhouse.yandex/docs/ru/operations/table_engines/aggregatingmergetree/ ) <!--hide-->