主キーテーブル
主キーテーブルは、StarRocks によって設計された新しいストレージエンジンを使用しています。その主な利点は、リアルタイムのデータ更新をサポートしながら、複雑なアドホッククエリに対して効率的なパフォーマンスを確保することにあります。リアルタイムのビジネス分析では、主キーテーブルを使用することで、最新のデータを用いてリアルタイムで結果を分析し、データ分析におけるデータ遅延を軽減することができます。しかし、主キーは万能ではありません。不適切に使用すると、リソースの無駄遣いにつながる可能性があります。
したがって、このセクションでは、主キーのモデルをより効率的に使用して、望ましい結果を達成する方法を案内します。
主キーインデックスの選択
主インデックスは、主キーテーブルの最も重要なコンポーネントです。主キーインデックスは、主キー値と、主キー値によって識別されるデータ行の位置との間のマッピングを格納するために使用されます。
現在、3 種類の主キーインデックスをサポートしています。
- メモリ内フル主キーインデックス。
PROPERTIES (
"enable_persistent_index" = "false"
);
- ローカルディスクベースの永続性主キーインデックス。
PROPERTIES (
"enable_persistent_index" = "true",
"persistent_index_type" = "LOCAL"
);
- クラウドネイティブ永続性主キーインデックス。
PROPERTIES (
"enable_persistent_index" = "true",
"persistent_index_type" = "CLOUD_NATIVE"
);
メモリ内インデックスの使用は推奨しません。これは、メモリリソースの大幅な無駄遣いにつながる可能性があるためです。
共有データ(エラスティック)StarRocks クラスタを使用している場合は、クラウドネイティブ永続性主インデックスを選択することをお勧めします。ローカルディスクベースの永続性主インデックスとは異なり、完全なインデックスデータをリモートオブジェクトストレージに格納し、ローカルディスクはキャッシュとしてのみ機能します。ローカルディスクベースの永続性主インデックスと比較して、その利点は次のとおりです。
- ローカルディスク容量に依存しない。
- データシャードのリバランス後にインデックスを再 構築する必要がない。
主キーの選択
主キーは通常、クエリを高速化するのに役立ちません。ORDER BY句を使用して、主キーとは異なる列をソートキーとして指定し、クエリを高速化することができます。したがって、主キーを選択する際には、データのインポートおよび更新プロセス中の一意性のみを考慮する必要があります。
主キーが大きいほど、メモリ、I/O、およびその他のリソースを多く消費します。したがって、一般的には、あまりにも多くの列や過度に大きな列を主キーとして選択することは避けることが推奨されます。主キーのデフォルトの最大サイズは 128 バイトで、be.conf の primary_key_limit_size パラメータによって制御されます。
primary_key_limit_size を増やしてより大きな主キーを選択することができますが、これによりリソース消費が増加することに注意してください。
永続性インデックスがどのくらいのストレージとメモリスペースを占有するか?
ストレージスペースコストの計算式
(key size + 8 bytes) * row count * 50%
50% は推定圧縮効率であり、実際の圧縮効果はデータ自体に依存します。
メモリコストの計算式
min(l0_max_mem_usage * tablet cnt, update_memory_limit_percent * BE process memory);
メモリ使用量
主キーテーブルによって使用されるメモリは、mem_tracker によって監視できます。
//全体のメモリ統計を表示
http://be_ip:be_http_port/mem_tracker
// 主キーテーブルのメモリ統計を表示
http://be_ip:be_http_port/mem_tracker?type=update
// 詳細を含む主キーテーブルのメモリ統計を表示
http://be_ip:be_http_port/mem_tracker?type=update&upper_level=4
mem_tracker の update 項目は、主キーインデックス、Delete Vector など、主キーテーブルによって使用される全メモリを記録します。この update 項目は、メトリクスモニターサービスを通じて監視することもできます。たとえば、Grafana では、次のように update 項目を確認できます(赤枠内の項目):

Prometheus と Grafana を使用したモニタリングとアラートについての詳細: https://docs.starrocks.io/docs/administration/management/monitoring/Monitor_and_Alert/
メモリ使用量に敏感で、PK テーブルのインポートプロセス中のメモリ消費を削減したい場合は、次の設定を通じてこれを達成できます。
be.conf
l0_max_mem_usage = (104857600 より小さい値、デフォルトは 104857600)
skip_pk_preload = true
// 共有なしクラスタ
transaction_apply_worker_count = (CPU コア数より小さい値、デフォルトは CPU コア数)
// 共有データクラスタ
transaction_publish_version_worker_count = (CPU コア数より小さい値、デフォルトは CPU コア数)
l0_max_mem_usage は、各 tablet の永続性主キーインデックスの 最大メモリ使用量を制御します。transaction_apply_worker_count と transaction_publish_version_worker_count は、主キーテーブルでの upsert と delete を処理するために使用できる最大スレッド数を制御します。
ただし、l0_max_mem_usage を削減すると I/O の負荷が増加する可能性があり、transaction_apply_worker_count または transaction_publish_version_worker_count を減少させるとデータ取り込みが遅くなる可能性があることを覚えておいてください。
Compaction リソース、データの新鮮さ、クエリ遅延のトレードオフ
他のモデルのテーブルと比較して、主キーテーブルは、データのインポート、更新、および削除中に主キーインデックスの検索と Delete Vector の生成のための追加の操作を必要とし、追加のリソースオーバーヘッドを導入します。したがって、これらの 3 つの要素の間でトレードオフを行う必要があります。
- Compaction リソースの制限。
- データの新鮮さ
- クエリ遅延