Sorted streaming aggregate
Общие методы агрегации в системах баз данных включают hash aggregate и sort aggregate.
Начиная с версии 1.5.0, Selena поддерживает sorted streaming aggregate.
Принципы работы
Узлы агрегации (AGG) в основном отвечают за обработку GROUP BY и агрегатных функций.
Sorted streaming aggregate может группировать данные путем сравнения ключей GROUP BY в соответствии с последовательностью ключей, без необходимости создания хеш-таблицы. Это эффективно снижает потребление памяти при агрегации. Для запросов с высокой кардинальностью агрегации sorted streaming aggregate улучшает производительность агрегации и снижает использование памяти.
Вы можете включить sorted streaming aggregate, установив следующую переменную:
set enable_sort_aggregate=true;
Ограничения
- Кластеры Selena shared-data не поддерживают sorted streaming aggregate.
- Ключи в GROUP BY должны иметь последовательность. Например, если ключ сортировки
k1, k2, k3, то:GROUP BY k1иGROUP BY k1, k2разрешены.GROUP BY k1, k3не следует последовательности ключа сортировки. Поэтому sorted streaming aggregate не может работать с таким условием.
- Выбранная партиция должна быть единственной партицией (поскольку один и тот же ключ может быть распределен на разных машинах в разных партициях).
- Ключи GROUP BY должны иметь такое же распределение, как ключи bucket, указанные при создании таблицы. Например, если таблица имеет три столбца
k1, k2, k3, ключом bucket может бытьk1илиk1, k2.- Если ключ bucket —
k1, ключомGROUP BYможет бытьk1,k1, k2илиk1, k2, k3. - Если ключ bucket —
k1, k2, ключом GROUP BY может бытьk1, k2илиk1, k2, k3. - Если планы запросов не соответствуют этому требованию, функция sorted streaming aggregate не может работать, даже если эта функция включена.
- Если ключ bucket —
- Sorted streaming aggregate работает только для агрегации первого этапа (то есть под узлом AGG есть только один узел Scan).
Примеры
-
Создайте таблицу и вставьте данные.
CREATE TABLE `test_sorted_streaming_agg_basic`
(
`id_int` int(11) NOT NULL COMMENT "",
`id_string` varchar(100) NOT NULL COMMENT ""
)
ENGINE=OLAP
DUPLICATE KEY(`id_int`)COMMENT "OLAP"
DISTRIBUTED BY HASH(`id_int`)
PROPERTIES
("replication_num" = "3");
INSERT INTO test_sorted_streaming_agg_basic VALUES
(1, 'v1'),
(2, 'v2'),
(3, 'v3'),
(1, 'v4'); -
Включите sorted streaming aggregate и испол ьзуйте EXPLAIN для запроса профиля SQL.
set enable_sort_aggregate = true;
explain costs select id_int, max(id_string)
from test_sorted_streaming_agg_basic
group by id_int;
Проверка включения sorted streaming aggregate
Просмотрите результаты EXPLAIN costs. Если поле sorted streaming имеет значение true в узле AGG, эта функция включена.
| |
| 1:AGGREGATE (update finalize) |
| | aggregate: max[([2: id_string, VARCHAR, false]); args: VARCHAR; result: VARCHAR; args nullable: false; result nullable: true] |
| | group by: [1: id_int, INT, false] |
| | sorted streaming: true |
| | cardinality: 1 |
| | column statistics: |
| | * id_int-->[-Infinity, Infinity, 0.0, 1.0, 1.0] UNKNOWN |
| | * max-->[-Infinity, Infinity, 0.0, 1.0, 1.0] UNKNOWN |
| | |
| 0:OlapScanNode |
| table: test_sorted_streaming_agg_basic, rollup: test_sorted_streaming_agg_basic |
| preAggregation: on |
| partitionsRatio=1/1, tabletsRatio=10/10 |
| tabletList=30672,30674,30676,30678,30680,30682,30684,30686,30688,30690 |
| actualRows=0, avgRowSize=2.0 |
| cardinality: 1 |
| column statistics: |
| * id_int-->[-Infinity, Infinity, 0.0, 1.0, 1.0] UNKNOWN |
| * id_string-->[-Infinity, Infinity, 0.0, 1.0, 1.0] UNKNOWN |