クエリプラン
クエリパフォーマンスの最適化は、分析システムにおける一般的な課題です。クエリが遅いと、ユーザーエクスペリエンスやクラスタ全体のパフォーマンスに悪影響を及ぼす可能性があります。StarRocksでは、クエリプランとクエリプロファイルを理解し解釈することが、遅いクエリを診断し改善するための基盤となります。これらのツールは以下のことに役立ちます。
- ボトルネックや高コストの操作を特定する
- 最適でないジョイン戦略やインデックスの欠如を見つける
- データがどのようにフィルタリング、集計、移動されるかを理解する
- リソース使用のトラブルシューティングと最適化
クエリプランは、StarRocks FE によって生成される詳細なロードマップで、SQL ステートメントがどのように実行されるかを説明します。クエリをスキャン、ジョイン、集計、ソートなどの一連の操作に分解し、それらを最も効率的に実行する方法を決定します。
StarRocks はクエリプランを確認するためのいくつかの方法を提供しています。
-
EXPLAIN ステートメント:
EXPLAINを使用して、クエリの論理または物理的な実行プランを表示します。出力を制御するオプションを追加できます。EXPLAIN LOGICAL <query>: 簡略化されたプランを表示します。EXPLAIN <query>: 基本的な物理プランを表示します。EXPLAIN VERBOSE <query>: 詳細情報を含む物理プランを表示します。EXPLAIN COSTS <query>: 各操作の推定コストを含み、統計の問題を診断するために使用されます。
-
EXPLAIN ANALYZE:
EXPLAIN ANALYZE <query>を使用してクエリを実行し、実際の実行プランと実行時の統計情報を表示します。詳細は Explain Anlayze ドキュメントを参照してください。例:
EXPLAIN ANALYZE SELECT * FROM sales_orders WHERE amount > 1000; -
Query Profile:
クエリを実行した後、その詳細な実行プロファイルを表示できます。これには、タイミング、リソース使用量、オペレーター レベルの統計が含まれます。詳細情報のアクセスと解釈については Query Profile ドキュメントを参照してください。- SQL コマンド:
SHOW PROFILELISTおよびANALYZE PROFILE FOR <query_id>を使用して、特定のクエリの実行プロファイルを取得できます。 - FE HTTP サービス: StarRocks FE の Web UI で Query または Profile セクションに移動して、クエリの実行詳細を検索および確認できます。
- マネージドバージョン: クラウドまたはマネージドデプロイメントでは、提供された Web コンソールまたはモニタリングダッシュボードを使用して、クエリプランとプロファイルを表示できます。多くの場合、視覚化やフィルタリングオプションが強化されています。
- SQL コマンド:
通常、クエリプランはクエリの計画と最適化に関連する問題を診断するために使用され、クエリプロファイルはクエリ実行中のパフォーマンス問題を特定するのに役立ちます。以下のセクションでは、クエリ実行の主要な概念を探り、クエリプランを分析する具体的な例を紹介します。
クエリ実行フロー
StarRocks におけるクエリのライフサイクルは、主に3つのフェーズで構成されています。
- 計画: クエリは解析、分析、最適化を経て、クエリプランの生成に至ります。
- スケジューリング: スケジューラとコーディネータがプランをすべての参加バックエンドノードに分配します。
- 実行: プランはパイプライン実行エンジンを使用して実行されます。

プラン構造
StarRocks のプランは階層的です。
- フラグメント: 最上位の作業スライスで、各フラグメントは異なるバックエンドノードで実行される複数の FragmentInstances を生成します。
- パイプライン: インスタンス内で、パイプラインはオペレーターを連結し、複数の PipelineDrivers が同じパイプラインを別々の CPU コアで同時に実行します。
- オペレーター: データを実際に処理するスキャン、ジョイン、集計などの基本的なステップです。

パイプライン実行エンジン
パイプラインエンジンは、クエリプランを並列かつ効率的に実行し、複雑なプランや大規模なデータ量を高パフォーマンスかつスケーラブルに処理します。

メトリックマージ戦略
デフォルトでは、StarRocks はプロファイルのボリュームを削減するために FragmentInstance と PipelineDriver レイヤーをマージし、簡略化された3層構造を生成します。
- フラグメント
- パイプライン
- オペレーター
このマージ動作は、セッション変数 pipeline_profile_level を通じて制御できます。