メインコンテンツまでスキップ

Sorted streaming aggregate

ソート済みストリーミング集計

データベースシステムの一般的な集約方法には、ハッシュ集約とソート集約があります。

StarRocksはv2.5以降、ソート済みストリーミング集計をサポートしています。

動作原理

集約ノード(AGG)は、GROUP BYと集計関数の処理を主に担当します。

ソート済みストリーミング集計では、キーの順序に従ってGROUP BYキーを比較してデータをグループ化するため、ハッシュテーブルを作成する必要がありません。これにより、集約に使用されるメモリリソースを効果的に削減できます。高い集約基数を持つクエリでは、ソート済みストリーミング集計により集約パフォーマンスが向上し、メモリ使用量も減少します。

ソート済みストリーミング集計を有効にするには、次の変数を設定します:

set enable_sort_aggregate=true;

制限事項

  • GROUP BYのキーは順序を持っている必要があります。例えば、ソートキーが k1, k2, k3 の場合、
    • GROUP BY k1 と  GROUP BY k1, k2 は許可されます。
    • GROUP BY k1, k3 はソートキーの順序に従っていません。そのため、このような句ではソート済みストリーミング集計を有効にすることはできません。
  • 選択されるパーティションは単一のパーティションである必要があります(同じキーが異なるパーティションの機械に分散している場合があります)。
  • GROUP BYキーは、テーブルの作成時に指定したバケットキーと同じ分布を持つ必要があります。例えば、テーブルには3つの列 k1, k2, k3 がある場合、バケットキーは k1 または k1, k2 にすることができます。
    • バケットキーが k1 の場合、GROUP BY キーは k1k1, k2、または k1, k2, k3 のいずれかです。
    • バケットキーが k1, k2 の場合、GROUP BY キーは k1, k2 または k1, k2, k3 のいずれかです。
    • クエリプランがこの要件を満たさない場合、ソート済みストリーミング集計機能は、この機能が有効になっていても効果を発揮することができません。
  • ソート済みストリーミング集計は、最初の段階の集計にのみ適用されます(つまり、AGGノードの下には1つのスキャンノードしかない場合にのみ適用されます)。

  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 の結果を表示します。AGGノード内の sorted streaming フィールドが 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 |