テーブルクラスタリング
StarRocks において、慎重に選ばれたソートキーは、物理設計の中で最も影響力のある要素です。このガイドでは、ソートキーがどのように機能するのか、そのシステム的な利点、そして自身のワークロードに対して効果的なキーを選ぶための具体的な手法を説明します。
例
あなたが毎日数十億行のデータを受信するテレメトリシステムを運用していると仮定します。各行には device_id と ts(タイムスタンプ)がタグ付けされています。ファクトテーブルで ORDER BY (device_id, ts) を定義することで、以下が保証されます:
device_idに対するポイントクエリがミリ秒単位で返されます。- ダッシュボードは各デバイスの最近の時間枠をフィルタリングし、ほとんどのデータをプルーニングします。
GROUP BY device_idのような集計はストリーミング集計から利益を得ます。- 各デバイスごとの近接タイムスタンプのランにより圧縮が向上します。
このシンプルな2列のソートキー ORDER BY (device_id, ts) は、数十億行にわたって I/O 削減、CPU 節約、より安定したクエリパフォーマンスを提供します。
CREATE TABLE telemetry (
device_id VARCHAR,
ts DATETIME,
value DOUBLE
)
ENGINE=OLAP
PRIMARY KEY(device_id, ts)
PARTITION BY date_trunc('day', ts)
DISTRIBUTED BY HASH(device_id) BUCKETS 16
ORDER BY (device_id, ts);
詳細な利点
-
大規模な I/O 削減—セグメント & ページプルーニング
仕組み:
各セグメントと 64 KB ページは、すべての列の最小/最大値を格納します。述語がその範囲外にある場合、StarRocks はそのチャンク全体をスキップし、ディスクに触れることはありません。
例:
SELECT count(*)
FROM events
WHERE tenant_id = 42
AND ts BETWEEN '2025-05-01' AND '2025-05-07';ORDER BY (tenant_id, ts)を使用すると、最初のキーが 42 に等しいセグメントのみが考慮され、その中で ts ウィンドウがその7日間と重なるページのみが対象となります。100 B 行のテーブルは 1 B 行未満をスキャンし、分単位を秒単位に変えます。
-
ミリ秒単位のポイントルックアップ—スパースプレフィックスインデックス
仕組み:
スパースプレフィックスインデックスは、約 1 K 個ごとのソートキー値を格納します。バイナリサーチで正しいページに着地し、単一のディスク読み取り(多くの場合、すでにキャッシュされている)が行を返します。
例:
SELECT *
FROM orders
WHERE order_id = 982347234;ORDER BY (order_id)を使用すると、プローブは 50 B 行のテーブルで約 50 キー比較を必要とし、コールドデータキャッシュでも 10 ms 未満のレイテンシーを実現します。
-
より速いソート集計
仕組み:
ソートキーが GROUP BY 句と一致する場合、StarRocks はスキャンしながらストリーミング集計を行います—ソートやハッシュテーブルは不要です。
このソート集計プランは、ソートキー順に行をスキャンし、グループを即時に生成し、CPU キャッシュの局所性を活用し、中間実体化をスキップします。
例:
SELECT device_id, COUNT(*)
FROM telemetry
WHERE ts BETWEEN '2025-01-01' AND '2025-01-31'
GROUP BY device_id;テーブルが
ORDER BY (device_id, ts)の場合、エンジンはストリームインする行をグループ化し、ハッシュテーブルを構築したり再ソートしたりせずに処理します。device_id のような高カーディナリティキーに対して、CPU とメモリ使用量を劇的に削減できます。ソートされた入力によるストリーミング集計は、大きなグループカーディナリティに対してハッシュ集計よりも通常 2–3 倍のスループットを向上させます。
-
より高い圧縮とホットなキャッシュ
仕組み:
ソートされたデータは、小さなデルタや長いランを示し、辞書、RLE、およびフレームオブリファレンスエンコーディングを加速します。コンパクトなページは、CPU キャッシュを通じて順次ストリームされます。
例:
(device_id, ts) でソートされたテレメトリテーブルは、同じデータを未ソートで取り込んだ場合と比べて、1.8 倍の圧縮(LZ4)と 25% の CPU/スキャン削減を達成しました。