Перейти к основному содержимому
Версия: 2.0.x

Потоковая агрегация с сортировкой

Распространённые методы агрегации в системах баз данных включают hash-агрегацию и агрегацию с сортировкой.

Начиная с версии v1.5.2, Selena поддерживает потоковую агрегацию с сортировкой (sorted streaming aggregate).

Принципы работы

Узлы агрегации (AGG) в основном отвечают за обработку GROUP BY и агрегатных функций.

Потоковая агрегация с сортировкой может группировать данные путём сравнения ключей GROUP BY в соответствии с последовательностью ключей, без необходимости создания hash-таблицы. Это эффективно снижает потребление памяти при агрегации. Для запросов с высокой кардинальностью агрегации потоковая агрегация с сортировкой улучшает производительность агрегации и уменьшает использование памяти.

Вы можете включить потоковую агрегацию с сортировкой, установив следующую переменную:

set enable_sort_aggregate=true;

Ограничения

  • Cluster Selena с разделяемыми данными (shared-data) не поддерживают потоковую агрегацию с сортировкой.
  • Ключи в GROUP BY должны следовать определённой последовательности. Например, если ключ сортировки — k1, k2, k3, тогда:
    • GROUP BY k1 и GROUP BY k1, k2 разрешены.
    • GROUP BY k1, k3 не соответствует последовательности ключа сортировки. Поэтому потоковая агрегация с сортировкой не сможет работать с таким выражением.
  • Выбранный partition должен быть единственным (поскольку один и тот же ключ может быть распределён на разных машинах в разных partition).
  • Ключи 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.
    • Если планы запросов не соответствуют этому требованию, функция потоковой агрегации с сортировкой не будет работать, даже если она включена.
  • Потоковая агрегация с сортировкой работает только для первой стадии агрегации (то есть под узлом 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. Включите потоковую агрегацию с сортировкой и используйте 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;

Проверка включения потоковой агрегации с сортировкой

Просмотрите результаты EXPLAIN costs. Если поле sorted streaming в узле AGG имеет значение true, функция включена.

|                                                                                                                                    |
| 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 |