クエリの実行が遅い場合、全体の実行時間(持続時間)を把握するだけでは不十分です。どの処理に時間がかかっているか、また実行計画のどの部分がボトルネックとなっているかを特定する必要があります。AnalyticDB for MySQL は、SQL 診断機能を提供しており、実行計画をインタラクティブな 2 レイヤー階層図として可視化します。この図は、クエリがクラスター全体でどのように実行されるか(ステージレイヤー)と、各ステージ内部でどのように実行されるか(オペレーターレイヤー)を明確に示します。各ノードには、実行時間、メモリ使用量、行数、および診断に基づく最適化推奨事項が表示されるため、推測することなく、最も遅いステージまたはオペレーターを正確に特定できます。
仕組み
実行計画は、2 レイヤー構成の階層図です。
ステージレイヤー:クエリが複数のステージに分割される様子、およびコンピュートノード間でのデータの流れを示します。
オペレーターレイヤー:単一のステージを掘り下げ、各オペレーター、そのプロパティ、およびリソース使用量を詳細に表示します。
両レイヤーとも、データは下から上へと流れます。ステージレイヤーでは、まずスキャンステージが生データを読み込み、中間ステージがデータを処理し、最上位のルートノードがクライアントへ結果を返します。オペレーターレイヤーも同様のパターンをとります:下位の TableScan オペレーターおよび RemoteSource オペレーターがデータを生成し、それを上位の StageOutput オペレーターまたは Output オペレーターへと送信します。
システムがステージまたはオペレーターに対して最適化の可能性を検出した場合、該当ノードに赤色の感嘆符(!)付きアイコンが表示されます。
ステージレイヤー
ステージレイヤーは、クエリ実行をクラスター全体の観点から把握するためのビューを提供します。

各ステージが表示する情報
各長方形は 1 つのステージを表し、以下の情報を表示します。
ステージ ID
データ出力タイプ(このステージからデータが出力される方法)
持続時間または消費メモリ — 右上隅の持続時間別およびメモリ別で切り替え可能です
ステージ間のデータフロー
隣接する 2 つのステージを結ぶ線に表示される数字は、上流ステージから下流ステージへと渡される行数です。線が太いほど、行数が多くなります。
ステージ間のデータ移動には、以下の 3 つの方法のいずれかが使用されます。
| データ出力方法 | 説明 |
|---|---|
| ブロードキャスト | 上流ステージの各コンピュートノードが、自身のデータの完全なコピーを下流ステージのすべてのコンピュートノードへ送信します。 |
| リパーティション | 上流ステージの各コンピュートノードが、特定のルールに従ってデータをパーティション分割し、各パーティションを下流ステージの指定されたコンピュートノードへ送信します。 |
| ギャザー | 上流ステージの各コンピュートノードが、自身の全データを下流ステージの単一のコンピュートノードへ送信します。 |
持続時間またはメモリ使用量の上位 10 ノード
右側の持続時間またはメモリ使用量順の上位 10 ノードパネルには、クエリ全体の持続時間またはメモリ使用量に占める割合が最も大きいステージが一覧表示されます。デフォルトでは、持続時間順に並べ替えられます。メモリ別を選択すると、メモリ使用量順に切り替わります。
全体の持続時間またはメモリ使用量に占める割合が 1 % 未満のステージは除外されます。これらのノードは、クエリ全体のパフォーマンスに影響を与えるほど大きくないためです。表示される割合の合計が 100 % にならない場合がありますが、これはメトリックの収集方法の違いによるものです。
診断結果
ステージ(例:Stage[1])をクリックすると、右側に診断結果パネルが開きます。このパネルには以下の内容が含まれます。
ステージ診断:ステージ内で検出された問題(例:大量のブロードキャストデータやデータスキューなど)に関する詳細な説明と、それらに対する最適化推奨事項。
オペレーター診断:ステージ内の問題を検出したオペレーターの概要。詳細および最適化に関する具体的なガイダンスについては、オペレーターレイヤーを参照してください。
ステージレベルの診断種別の完全な一覧については、「ステージレベルの診断結果」をご参照ください。
ステージ統計情報
診断結果の下にある統計情報セクションには、選択されたステージのリソースメトリックが表示されます。
| メトリック | 説明 |
|---|---|
| ピークメモリ | ステージが消費した最大メモリ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。 |
| 累積持続時間 | ステージ内のすべてのノード、スレッド、およびオペレーターにおける合計実行時間。単位は自動的に ms、s、m、h にスケールします。この値は、並列実行ワーカーの合計であり、クエリ全体の実行時間と直接比較することはできません。 |
| 出力行数 | ステージが生成する行数。 |
| 出力データ量 | ステージが生成するデータ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。 |
| 入力行数 | ステージが受信する行数。 |
| 入力データ量 | ステージが受信するデータ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。 |
| スキャン行数 | ストレージから読み取られた行数。スキャンオペレーターを含むステージのみに表示されます。 |
| スキャンサイズ | ストレージから読み取られたデータ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。スキャンオペレーターを含むステージのみに表示されます。 |
オペレーターレイヤー
オペレーターレイヤーは、単一のステージ内部における実行計画を、個々のオペレーター単位まで詳細に表示します。
オペレーターレイヤーを開くには、任意のステージ上にマウスカーソルを合わせ、表示されるツールチップ内のステージ計画の表示をクリックします。


各オペレーターが表示する情報
各長方形は 1 つのオペレーターを表し、以下の情報を表示します。
オペレーター名および ID
プロパティ — 例:JOIN オペレーターの結合条件およびアルゴリズム
持続時間または消費メモリ — 持続時間別およびメモリ別で切り替え可能です
オペレーター間のデータフロー
隣接する 2 つのオペレーターを結ぶ線に表示される数字は、上流オペレーターから下流オペレーターへと渡される行数です。線が太いほど、行数が多くなります。
持続時間またはメモリ使用量の上位 10 ノード
持続時間またはメモリ使用量順の上位 10 ノードパネルには、ステージ内の持続時間またはメモリ使用量に占める割合が最も大きいオペレーターが一覧表示されます。デフォルトでは、持続時間順に並べ替えられます。メモリ別を選択すると、メモリ使用量順に切り替わります。全体の持続時間またはメモリ使用量に占める割合が 1 % 未満のオペレーターは除外されます。表示される割合の合計が 100 % にならない場合がありますが、これはメトリックの収集方法の違いによるものです。
診断結果
オペレーター(例:Join[36184])をクリックすると、その診断結果パネルが開きます。このパネルには、該当オペレーターで検出された問題(例:データスキュー、JOIN 時の右側テーブルの過大化など)および最適化推奨事項が表示されます。

オペレーターレベルの診断種別の完全な一覧については、「オペレーターレベルの診断結果」をご参照ください。
オペレーター統計情報
診断結果の下にある統計情報セクションには、選択されたオペレーターのリソースメトリックが表示されます。
| メトリック | 説明 |
|---|---|
| ピークメモリ | オペレーターが消費した最大メモリ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。 |
| 所要時間 | オペレーターが実際の同時実行数で実行された際の平均実行時間。単位は自動的に ms、s、m、h にスケールします。この値は、クエリ全体の実行時間と直接比較できます。 |
| 出力行数 | オペレーターが生成する行数。 |
| 出力データ量 | オペレーターが生成するデータ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。 |
| 入力行数 | オペレーターが受信する行数。 |
| 入力データ量 | オペレーターが受信するデータ量。単位は自動的に Bytes、KB、MB、GB、TB にスケールします。 |
| ビルダー統計情報 | JOIN オペレーターのビルドフェーズに関する統計情報。ビルダーの種類、ピークメモリ、持続時間、入力行数、出力行数、データ量を含みます。利用可能なビルダーの種類は以下の 3 種類です:HashBuilder(ハッシュ結合用のハッシュテーブルを構築)、SetBuilder(セミ結合用のセットを構築)、NestLoopBuilder(ネステッドループ結合を処理)。JOIN オペレーターのみに表示されます。 |
| プロパティ | オペレーター固有の構成詳細。JOIN オペレーターの場合には、結合タイプおよび結合方法が含まれます。オペレーターのプロパティの完全な一覧については、「オペレーター」をご参照ください。 |
一般的なパフォーマンスパターン
以下に示すパターンは、遅いクエリの実行計画においてよく見られるものです。ステージレイヤーおよびオペレーターレイヤーを活用して、これらのパターンを特定してください。
大量のブロードキャストデータ
ブロードキャストでは、上流データの完全なコピーがすべての下流コンピュートノードへ転送されます。上流ステージが大規模な場合、ネットワークトラフィックおよびメモリ使用量が大幅に増加します。ステージの出力方法がブロードキャストであり、接続線の行数が非常に多いものを確認してください。ステージ診断パネルがこの問題を検出し、最適化推奨事項を提示します。
データスキュー
データスキューとは、あるコンピュートノードが他のノードよりもはるかに多くの行を処理する状態を指します。ステージレイヤーでは、スキューが発生しているステージは、同様の機能を持つ他のステージと比較して累積持続時間が著しく高くなる傾向があります。診断結果パネルがスキューを検出し、最適化のためのソリューションを提案します。
JOIN の右側テーブルの過大化
JOIN オペレーターにおいて、右側テーブルはビルドフェーズ中にメモリにロードされます。右側テーブルが過大であると、JOIN オペレーターのピークメモリが高くなります。オペレーターのビルダーステータス(統計情報セクション内)を確認し、ビルドフェーズのメモリ使用量および行数をチェックしてください。診断結果パネルがこの問題を検出した場合、該当箇所にフラグが立てられます。