Перейти к основному содержимому

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 не может работать, даже если эта функция включена.
  • Sorted streaming aggregate работает только для агрегации первого этапа (то есть под узлом AGG есть только один узел Scan).

Примеры

  1. Создайте таблицу и вставьте данные.

    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');
  2. Включите 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 |