2018-09-19 08:21:53 +00:00
< a name = "table_engine-aggregatingmergetree" > < / a >
2017-12-11 12:07:26 +00:00
# AggregatingMergeTree
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
Движок наследует функциональность [MergeTree ](mergetree.md#table_engines-mergetree ), изменяя логику слияния кусков данных. В с е строки с одинаковым первичным ключом ClickHouse заменяет на одну (в пределах одного куска данных), которая хранит объединение состояний агрегатных функций.
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
Таблицы типа `AggregatingMergeTree` могут использоваться для инкрементальной агрегации данных, в том числе, для агрегирующих материализованных представлений.
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
Движок обрабатывает все столбцы типа [AggregateFunction ](../../data_types/nested_data_structures/aggregatefunction.md#data_type-aggregatefunction ).
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
Использование `AggregatingMergeTree` оправдано только в том случае, когда это уменьшает количество строк на порядки.
2017-03-12 17:58:51 +00:00
2018-09-28 12:18:42 +00:00
## Создание таблицы
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
```
2018-09-28 12:18:42 +00:00
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
2018-09-24 21:24:03 +00:00
```
2017-03-12 17:58:51 +00:00
2018-09-28 12:18:42 +00:00
Описание параметров запроса смотрите в [описании запроса ](../../query_language/create.md#query_language-queries-create_table ).
**Секции запроса**
2018-01-19 14:36:40 +00:00
2018-09-24 21:24:03 +00:00
`AggregatingMergeTree` использует те же [секции ENGINE ](mergetree.md#table_engines-mergetree-configuring ), что и `MergeTree` .
2017-03-12 17:58:51 +00:00
2018-01-19 14:36:40 +00:00
2018-09-24 21:24:03 +00:00
### Устаревший способ конфигурирования движка
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
!!!attention
Н е используйте этот способ в новых проектах и по возможности переведите старые проекты на способ описанный выше.
2017-03-12 17:58:51 +00:00
2017-10-25 05:27:09 +00:00
```sql
2018-09-28 12:18:42 +00:00
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]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-09-24 21:24:03 +00:00
В с е параметры имеют то же значение, что в и `MergeTree` .
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
## SELECT/INSERT данных
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
Для вставки данных используйте `INSERT SELECT` с агрегатными `-State` -функциями.
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
При выборке данных из таблицы `AggregatingMergeTree` , используйте `GROUP BY` и те же агрегатные функции, что и при вставке данных, но с суффиксом `-Merge` .
В запросах `SELECT` значения типа `AggregateFunction` выводятся во всех форматах, которые поддерживает ClickHouse, в виде implementation-specific бинарных данных. Если с помощью `SELECT` выполнить дамп данных, например, в формат `TabSeparated` , то потом этот дамп можно загрузить обратно с помощью запроса `INSERT` .
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
## Пример агрегирущего материализованного представления
2018-01-19 14:36:40 +00:00
Создаём материализованное представление типа `AggregatingMergeTree` , следящее за таблицей `test.visits` :
2017-03-12 17:58:51 +00:00
2017-10-25 05:27:09 +00:00
```sql
CREATE MATERIALIZED VIEW test.basic
2018-09-24 21:24:03 +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-09-24 21:24:03 +00:00
Вставляем данные в таблицу `test.visits` :
2017-03-12 17:58:51 +00:00
2017-10-25 05:27:09 +00:00
```sql
INSERT INTO test.visits ...
```
2017-03-12 17:58:51 +00:00
2018-09-24 21:24:03 +00:00
Данные окажутся и в таблице и в представлении `test.basic` , которое выполнит агрегацию.
Чтобы получить агрегированные данные, выполним запрос вида `SELECT ... GROUP BY ...` из представления `test.basic` :
2017-03-12 17:58:51 +00:00
2017-10-25 05:27:09 +00:00
```sql
SELECT
StartDate,
sumMerge(Visits) AS Visits,
uniqMerge(Users) AS Users
FROM test.basic
GROUP BY StartDate
ORDER BY StartDate;
```