Sorted streaming aggregate
データベースシステムにおける一般的な集計方法には、ハッシュ集計とソート集計があります。
バージョン 2.5 以降、StarRocks は sorted streaming aggregate をサポートしています。
動作原理
集計ノード (AGG) は主に GROUP BY と集計関数を処理する役割を担っています。
Sorted streaming aggregate は、GROUP BY キーをキーの順序に従って比較することでデータをグループ化し、ハッシュテーブルを作成する必要がありません。これにより、集計に消費されるメモリリソースを効果的に削減します。高い集計カーディナリティを持つクエリでは、sorted streaming aggregate により集計パフォーマンスが向上し、メモリ使用量が削減されます。
次の変数を設定することで、sorted streaming aggregate を有効にできます。
set enable_sort_aggregate=true;
制限事項
- StarRocks 共有データクラスタは sorted streaming aggregate をサポートしていません。
- GROUP BY のキーには順序が必要です。例えば、ソートキーが
k1, k2, k3
の場合:GROUP BY k1
およびGROUP BY k1, k2
は許可されます。GROUP BY k1, k3
はソートキーの順序に従っていません。したがって、そのような句では sorted streaming aggregate は効果を発揮しません。
- 選択されたパーティションは単一のパーティションでなければなりません(同じキーが異なるパーティションの異なるマシンに分散される可能性があるため)。
- GROUP BY のキーは、テーブル作成時に指定されたバケットキーと同じ分布でなければなりません。例えば、テーブルに
k1, k2, k3
の3つの列がある場合、バケットキーはk1
またはk1, k2
になり得ます。- バケットキーが
k1
の場合、GROUP BY
キーはk1
、k1, k2
、またはk1, k2, k3
になり得ます。 - バケットキーが
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'); -
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
の結果を確認します。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 |