クエリプロファイルの構造とメトリクス
クエリプロファイルの構造
クエリプロファイルの構造は、StarRocks の実行エンジンの設計に密接に関連しており、以下の5つの部分で構成されています。
- Fragment: 実行ツリー。クエリは1つ以上のフラグメントで構成されます。
- FragmentInstance: 各フラグメントは複数のインスタンスを持つことができ、各インスタンスは FragmentInstance と呼ばれ、異なるコンピュートノード によって実行されます。
- Pipeline: FragmentInstance は複数のパイプラインに分割されます。パイプラインは、接続された Operator インスタンスのグループからなる実行チェーンです。
- PipelineDriver: パイプラインは複数のインスタンスを持つことができ、各インスタンスは PipelineDriver と呼ばれ、複数の計算コアを最大限に活用します。
- Operator: PipelineDriver は複数の Operator インスタンスで構成されています。

クエリプロファイルのマージ戦略
クエリプロファイルの構造を分析することで、同じ Fragment に関連する複数の FragmentInstance が構造的に高い類似性を持っていることが容易に観察できます。同様に、同じ Pipeline に属する複数の PipelineDriver も類似した構造的特徴を示します。クエリプロファイルのボリュームを削減するために、StarRocks はデフォルトで FragmentInstance 層と PipelineDriver 層をマージします。その結果、元の5層構造は3層に簡略化されます。
- Fragment
- Pipeline
- Operator
このマージ動作は、セッション変数 pipeline_profile_level を通じて制御できます。この変数には2つの有効な値 があります。
1(デフォルト): StarRocks はメトリクスを3層構造にマージします。2: StarRocks はメトリクスをマージしません。元の5層構造が保持されます。- その他の値はデフォルト値
1として扱われます。
一般的に、このパラメータを 2 に設定することは推奨されません。5層構造のクエリプロファイルには多くの制限があります。例えば、プロファイルを可視化ツールで分析することができません。したがって、マージプロセスが重要な情報の損失を引き起こさない限り、このパラメータを調整する必要はありません。
メトリクスのマージと MIN/MAX 値
FragmentInstance と PipelineDriver をマージする際、同じ名前のすべてのメトリクスがマージされます。すべての同時実行インスタンスの各メトリクスの最小値と最大値のみが記録されます。異なるタイプのメトリクスは異なるマージ戦略を使用します。
- 時間関連のメトリクスは平均を取ります。例えば:
OperatorTotalTimeはすべての同時実行インスタンスの平均時間消費です。__MAX_OF_OperatorTotalTimeはすべての同時実行インスタンスの最大時間消費です。__MIN_OF_OperatorTotalTimeはすべての同時実行インスタンスの最小時間消費です。
- OperatorTotalTime: 2.192us
- __MAX_OF_OperatorTotalTime: 2.502us
- __MIN_OF_OperatorTotalTime: 1.882us
- 時間に関連しないメトリクスは合計されます。例えば:
PullChunkNumはすべての同時実行インスタンスのこのメトリクスの合計です。__MAX_OF_PullChunkNumはすべての同時実行インスタンスのこのメトリクスの最大値です。__MIN_OF_PullChunkNumはすべての同時実行インスタンスのこのメトリクスの最小値です。
- PullChunkNum: 146.66K (146660)
- __MAX_OF_PullChunkNum: 24.45K (24450)
- __MIN_OF_PullChunkNum: 24.435K (24435)
- 極値を持たない一部のメトリクスは、すべての同時実行インスタンスで同じ値を持ちます。例えば:
DegreeOfParallelism。
通常、MIN と MAX の値に大きな差がある場合、データの偏 りが高い可能性を示しています。考えられるシナリオには、集計やジョイン操作が含まれます。
- OperatorTotalTime: 2m48s
- __MAX_OF_OperatorTotalTime: 10m30s
- __MIN_OF_OperatorTotalTime: 279.170us
クエリプロファイルメトリクスリスト
クエリプロファイルには、クエリの実行に関する詳細情報を提供する多数のメトリクスが含まれています。ほと んどの場合、オペレーターの実行時間と処理されたデータのサイズにのみ注目する必要があります。ボトルネックを特定したら、それに特化して対処できます。
サマリーメトリクス
Total
説明: クエリによって消費された総時間。計画、実行、およびプロファイリングフェーズの期間を含みます。
Query State
説明: クエリの状態。可能な状態には、Finished、Error、および Running が含まれます。
実行概要メトリクス
FrontendProfileMergeTime
説明: フロントエンド (FE) 側でのクエリプロファイル処理時間。
QueryAllocatedMemoryUsage
説明: すべてのコンピュートノードにわたる累積割り当てメモリ。
QueryDeallocatedMemoryUsage
説明: すべてのコンピュートノードにわたる累積解放メモリ。
QueryPeakMemoryUsage
説明: すべてのコンピュートノードにわたる最大ピークメモリ。
QueryExecutionWallTime
説明: 実行のウォール時間。
QueryCumulativeCpuTime
説明: すべてのコンピュートノードにわたる累積 CPU 時間。
QueryCumulativeOperatorTime
説明: すべてのノードにわたる累積時間。これは単純な線形累積ですが、実際には異なるオペレーターの実行時間が重なる可能性があります。このパラメータは、各オペレーターに費やされた時間の割合を計算するための分母として機能します。
QueryCumulativeNetworkTime
説明: すべての Exchange ノードの累積ネットワーク時間。累積オペレーター時間と同様に、異なる Exchange の実際の実行時間が重なる可能性があります。
QueryCumulativeScanTime
説明: すべての Scan ノードの累積 IO 時間。累積オペレーター時間と同様に、異なる Scan 操作の実際の実行時間が重なる可能性があります。
QueryPeakScheduleTime
説明: すべてのパイプラインにわたる最大 ScheduleTime メトリクス。
QuerySpillBytes
説明: ローカルディスクにスピルされたデータのサイズ。
ResultDeliverTime
説明: 結果を転送するための追加時間。クエリ文の場合、このパラメータはクライアントにデータを返すのにかかる時間を指し、挿入文の場合、ストレージ層にデータを書き込むのにかかる時間を指します。
フラグメントメトリクス
InstanceNum
説明: このフラグメントのすべての FragmentInstance の数。
InstanceIds
説明: このフラグメントのすべての FragmentInstance の ID。
BackendNum
説明: このフラグメントの実行に参加している BE の数。
BackendAddresses
説明: このフラグメントの実行に参加しているすべての BE のアドレス。
FragmentInstancePrepareTime
説明: フラグメントの準備フェーズに費やされた時間。
InstanceAllocatedMemoryUsage
説明: このフラグメントのすべての FragmentInstance に対する累積割り当てメモリ。
InstanceDeallocatedMemoryUsage
説明: このフラグメントのすべての FragmentInstance に対する累積解放メモリ。
InstancePeakMemoryUsage
説明: このフラグメントのすべての FragmentInstance にわたるピークメモリ使用量。
パイプラインメトリ クス
コアメトリクス間の関係は次の図で示されています。
- DriverTotalTime = ActiveTime + PendingTime + ScheduleTime
- ActiveTime = ∑ OperatorTotalTime + OverheadTime
- PendingTime = InputEmptyTime + OutputFullTime + PreconditionBlockTime + PendingFinishTime
- InputEmptyTime = FirstInputEmptyTime + FollowupInputEmptyTime

DegreeOfParallelism
説明: パイプライン実行の並行性の度合い。
TotalDegreeOfParallelism
説明: 並行性の度合いの合計。同じパイプラインが複数のマシンで実行される可能性があるため、この項目はすべての値を集計します。
DriverPrepareTime
説明: 準備フェーズにかかる時間。このメトリクスは DriverTotalTime に含まれません。
DriverTotalTime
説明: 準備フェーズを除くパイプラインの総実行時間。
ActiveTime
説明: 各オペレーターの実行時間と、has_output、need_input などのメソッドの呼び出しに費やされる時間などの全体的なフレームワークオーバーヘッドを含むパイプラインの実行時間。
PendingTime
説明: さまざまな理由でスケジュールされるのを妨げられるパイプラインの時間。
InputEmptyTime
説明: 空の入力キューのためにブロックされているパイプラインの時間。
FirstInputEmptyTime
説明: 空の入力キューのために最初にブロックされたパイプラインの時間。最初のブロック時間は、主にパイプラインの依存関係によって引き起 こされるため、別途計算されます。
FollowupInputEmptyTime
説明: 空の入力キューのためにその後ブロックされたパイプラインの時間。
OutputFullTime
説明: 出力キューがいっぱいのためにブロックされているパイプラインの時間。
PreconditionBlockTime
説明: 依存関係が満たされていないためにブロックされているパイプラインの時間。
PendingFinishTime
説明: 非同期タスクの完了を待っている間にブロックされているパイプラインの時間。
ScheduleTime
説明: 準備完了キューに入ってから実行のためにスケジュールされるまでのパイプラインのスケジュール時間。
BlockByInputEmpty
説明: InputEmpty のためにブロックされたパイプラインの回数。
BlockByOutputFull
説明: OutputFull のためにブロックされたパイプラインの回数。
BlockByPrecondition
説明: 事前条件が満たされていないためにブロックされたパイプラインの回数。
オペレーター一般メトリクス
PrepareTime
説明: 準備に費やされた時間。
OperatorTotalTime
説明: オペレーターによって消費された総時 間。次の方程式を満たします: OperatorTotalTime = PullTotalTime + PushTotalTime + SetFinishingTime + SetFinishedTime + CloseTime。準備に費やされた時間は含まれません。
PullTotalTime
説明: オペレーターが push_chunk を実行するのに費やす総時間。
PushTotalTime
説明: オペレーターが pull_chunk を実行するのに費やす総時間。
SetFinishingTime
説明: オペレーターが set_finishing を実行するのに費やす総時間。
SetFinishedTime
説明: オペレーターが set_finished を実行するのに費やす総時間。
PushRowNum
説明: オペレーターの入力行の累積数。
PullRowNum
説明: オペレーターの出力行の累積数。
JoinRuntimeFilterEvaluate
説明: ジョインランタイムフィルターが評価される回数。
JoinRuntimeFilterHashTime
説明: ジョインランタイムフィルターのハッシュを計算するのに費やされた時間。
JoinRuntimeFilterInputRows
説明: ジョインランタイムフィルターの入力行数。
JoinRuntimeFilterOutputRows
説明: ジョインランタイムフィルターの出力行数。
JoinRuntimeFilterTime
説明: ジョインランタイムフィルターに費や された時間。
ユニークメトリクス
スキャンオペレーター
スキャンオペレーターは、IO タスクを実行するために追加のスレッドプールを利用します。したがって、このノードの時間メトリクス間の関係は以下のように示されています。
OLAP スキャンオペレーター
スキャンオペレーター内のさまざまなメトリクスをよりよく理解するために、以下の図はこれらのメトリクスとストレージ構造との関連を示しています。

Table
- 説明: テーブル名。
- レベル: プライマリメトリック
Rollup
- 説明: マテリアライズドビュー名。マテリアライズドビューがヒットしない場合、テーブル名と同等です。
- レベル: プライマリメトリック
SharedScan
- 説明: enable_shared_scan セッション変数が有効かどうか。
- レベル: プライマリメトリック
TabletCount
- 説明: タブレットの数。
- レベル: プライマリメトリック
MorselsCount
- 説明: モーセルの数。
- レベル: プライマリメトリック
PushdownPredicates
- 説明: プッシュダウン述語の数。
- レベル: プライマリメトリック
Predicates
- 説明: 述語式。
- レベル: プライマリメトリック
BytesRead
- 説明: 読み取られたデータのサイズ。
- レベル: プライマリメトリック
CompressedBytesRead
- 説明: ディスクから読み取られた圧縮データのサイズ。
- レベル: プライマリメトリック
UncompressedBytesRead
- 説明: ディスクから読み取られた非圧縮データのサイズ。
- レベル: プライマリメトリック
RowsRead
- 説明: 読み取られた行数(述語フィルタリング後)。
- レベル: プライマリメトリック