クエリ分析¶
クエリ分析はデータベースモジュールの独立した分析エントリで、インスタンス横断のクエリ集約表示をサポートします。複数のデータベースインスタンスを管理している場合、インスタンスごとの詳細ページに入らずに、グローバルな視点でシステムレベルのスロークエリのボトルネックを特定できます。
対応データベース種別
クエリ分析は現在 MySQL、PostgreSQL、Oracle、SQL Server、MongoDB に対応しています。データベース種別を切り替えると、リストはその種別に応じて対応するインスタンスのクエリデータを再読み込みします。
機能概要¶
エクスプローラーが単一インスタンスを単位としたクエリ分析であるのに対し、クエリ分析の主な機能は次のとおりです。
- インスタンス横断集約: 同じビジネス SQL が複数のインスタンスで実行された場合、自動的にグローバルな累計データとして集約され、インスタンスごとに調査する必要がなくなります。
- 類似クエリの統合: パラメータ値が異なる類似 SQL(例:
WHERE id = 1とWHERE id = 2)を自動的に識別し、同じクエリテンプレートとして統合して集計します。同じステートメントがパラメータの違いによって分散表示されるのを防ぎます。 - 全体性能のソート: 合計所要時間、実行回数、平均所要時間などの複数次元でのソートに対応し、全体のパフォーマンスボトルネックを素早く特定できます。
ページレイアウト¶
クエリ分析ページは、上部操作バー、左側のクイックフィルター、クエリリスト、詳細サイドパネルで構成されます。
上部操作バー¶
| 要素 | 説明 |
|---|---|
| データベース種別セレクター | ドロップダウンで MySQL / PostgreSQL / Oracle / SQL Server / MongoDB を切り替え。切り替え後、リストはその種別に応じて再読み込みされます |
| SQL テンプレート検索 | キーワードによる SQL テンプレートの検索に対応。入力は 512 バイト以内 |
| クエリ総数 | 現在のフィルター条件におけるクエリテンプレートの数を表示 |
| エクスポート | 現在のリストページを CSV ファイル、TXT、またはダッシュボードへエクスポート |
| 表示項目 | リストの列の表示/非表示をカスタマイズ可能 |
左側のクイックフィルター¶
| フィルター項目 | 説明 |
|---|---|
| インスタンス名 | 複数選択可能。このデータベース種別のすべてのインスタンスを表示 |
| データベースアドレス | 複数選択可能。データベース接続アドレスでフィルタリング |
| 合計所要時間 | 範囲によるセグメントフィルタリング |
| 実行回数 | 範囲によるセグメントフィルタリング |
時間範囲の連動
クエリ分析の時間範囲は、グローバルの時間ウィジェットと連動します。リストデータと詳細サイドパネルのトレンドグラフは、選択した時間ウィンドウに基づいてリアルタイムに集約されます。
クエリリスト¶
リストには、現在の時間範囲とデータベース種別において、集約されたすべてのクエリテンプレートが表示されます。各レコードは 1 種類の SQL(パラメータは ? に置換済み)を表し、選択したすべてのインスタンス上での実行データを集約しています。
リストのフィールド¶
| フィールド | 説明 |
|---|---|
| SQL テンプレート | パラメータを ? に置換した SQL テキスト。リストには最大 2 行表示されます。クリックすると右側の詳細サイドパネルが開きます |
| 実行回数 | 時間範囲内で、この種別のクエリがすべてのインスタンスで実行された累計回数 |
| 平均所要時間 | この種別のクエリの 1 回あたりの平均実行時間 |
| 合計所要時間 | 時間範囲内で、この種別のクエリがすべてのインスタンスで実行された累計時間 |
| パフォーマンス負荷割合 | この種別のクエリの累計所要時間が、全クエリの累計所要時間に占める割合。プログレスバーで可視化されます。割合が高いほど、この種別のクエリがシステム全体のパフォーマンスに与える影響が大きいことを示します |
| 平均スキャン行数 | この種別のクエリの全インスタンスにおける平均スキャン/返却行数。クエリのデータスキャン範囲の評価に使用します |
| トレンド | 現在の時間範囲における実行回数のミニ折れ線グラフ(スパークライン)。リストページの時間範囲と連動します |
SQL テンプレートと元の SQL
リストに表示される SQL テンプレートは、具体的なパラメータ値が ? に置換されています。ステートメントの構造自体に注目しやすくするためです。詳細サイドパネルでは、このテンプレートに該当する直近に出現した元の SQL サンプルを確認でき、完全なテキストをワンクリックでコピーできます。
クエリ詳細サイドパネル¶
リストの任意の行をクリックすると、右側にクエリ詳細サイドパネルがスライド表示され、この種別のクエリの全体パフォーマンスデータが表示されます。サイドパネルには以下のタブがあります。
完全な SQL¶
サイドパネル上部に固定表示されるこの種別のクエリの完全な SQL テンプレート(パラメータは ? に置換済み)。ワンクリックでコピーできます。
パフォーマンストレンド¶
リストページの時間範囲と連動し、時系列グラフでこの種別のクエリの 3 つの主要指標を表示します。
| グラフ | 説明 |
|---|---|
| 実行回数 | 回/分。この種別のクエリの並行処理負荷のトレンドを反映 |
| 平均所要時間 | ミリ秒(ms)。この種別のクエリの 1 回あたりの実行効率のトレンドを反映 |
| 合計所要時間 | ミリ秒(ms)。この種別のクエリがシステム全体で消費する時間のトレンドを反映 |
各指標は独立した時系列グラフで表示され、時間間隔の選択によるフィルタリングやグラフのエクスポートに対応しています。
インスタンス¶
この種別のクエリの各インスタンスにおける実行分布を表示し、ボトルネックがどのインスタンスに集中しているかの判断に役立ちます。
| フィールド | 説明 |
|---|---|
| データベースアドレス | インスタンスの接続アドレス |
| インスタンス名 | データベースインスタンスの識別子 |
| 実行回数 | このインスタンス上でのこの種別のクエリの実行回数。プログレスバーで可視化 |
| 平均所要時間 | このインスタンス上でのこの種別のクエリの平均実行時間 |
| 合計所要時間 | このインスタンス上でのこの種別のクエリの累計実行時間。プログレスバーで可視化 |
| 平均送信行数 | このインスタンス上でのこの種別のクエリが平均で返却した行数 |
| エラー回数 | このインスタンス上でのこの種別のクエリの実行失敗回数 |
- インスタンス名はクリック可能で、新しいページでそのインスタンスの単一インスタンスのクエリ詳細ページ(既存のエクスプローラー詳細を再利用)が開きます。
- 検索ボックスでインスタンス名またはデータベースアドレスによるフィルタリングに対応しています。
ユーザー¶
この種別のクエリの各データベースアカウントにおける実行分布を表示します。
| フィールド | 説明 |
|---|---|
| ユーザー | データベースアカウント名 |
| サンプル数 | このユーザーがこの種別のクエリを実行した回数 |
| 平均所要時間 | このユーザーがこの種別のクエリを実行した平均時間 |
- 検索ボックスでユーザー名によるフィルタリングに対応しています。
クエリサンプル¶
この種別のクエリの実際のサンプリングレコードを表示します。フィールドはデータベース種別によって異なります。
MySQL のフィールド例:
| フィールド | 説明 |
|---|---|
| 時間 | サンプリングが発生したタイムスタンプ |
| データベース | 対象データベース(スキーマ) |
| 実行時間 | このサンプルの実際の実行所要時間 |
| ユーザー | このサンプルを実行したデータベースアカウント |
| 待機グループ | このサンプルの待機イベントグループ |
データベース種別によるサンプルフィールドの違い
クエリサンプルの表示フィールドはデータベース種別に関連します。たとえば SQL Server では「セッション ID、待機タイプ、CPU 所要時間」などのフィールドが表示され、Oracle と PostgreSQL でもそれぞれのネイティブなパフォーマンスフィールドが表示されます。具体的なフィールドはページの実際の表示に従います。
実行プラン¶
クエリリストで SQL テンプレートをクリックすると、詳細サイドパネルが開き、実行プランに入ります。実行プランは、データベースオプティマイザーが現在のクエリに対して選択した実行方式を示し、クエリにフルテーブルスキャン、インデックスの不適切な使用、Join コストの高さなどの問題がないかを判断するために使用できます。
対応データベース種別
実行プランは現在 MySQL、PostgreSQL、Oracle、SQL Server に対応しており、MongoDB はサポートされていません。実行プランが表示されるのは、現在の環境で実行プラン収集が有効になっており、システムが対応するプランデータを収集済みの場合のみです。
実行プランの選択¶
同じクエリでも、データベースインスタンスによって異なる実行プランが採用される場合があり、同じインスタンスに複数のプランが存在する場合もあります。ページ上部のセレクターで切り替えて表示できます。選択肢はインスタンス名とプラン識別子で構成され、例: prod-sql-01 · 0x72AE91F3。
SQL Server を例にとると、プラン識別子は Plan Hash と表示されます。同じクエリで Plan Hash が変化した場合、通常はデータベースが異なる実行方法を採用したことを示します。
プランを選択すると、ページにそのプランが属するデータベースインスタンス、データベース名、プラン識別子が表示されます。
利用上のアドバイス
まずパフォーマンストレンドとインスタンスで所要時間の異常を特定し、そのうえで実行プランに進んでノードの依存関係と高コスト操作を確認することをお勧めします。トポロジー図は全体の実行経路の把握に適しており、ノードリストはノードデータの比較に適しています。XML / JSON はデータベースが返した完全な生情報の確認に適しています。
トポロジー図¶
トポロジー図は、実行プラン内のノード階層に従ってデータベースの実行ステップを表示します。ノード間の線はノードの依存関係を示すものであり、クエリの実際の実行タイムラインではありません。
各ノードには、データベースが返したデータに基づいて以下の情報が表示されます。
- 実行操作名。
- 論理操作(元のプランにこのフィールドが含まれ、かつ実行操作と異なる場合のみ表示)。
- アクセスするテーブルまたはインデックス。
Rows: データベースオプティマイザーが予測するノードの出力行数。Cost: 現在のノードとその子ノードの相対コスト。
トポロジー図は拡大、縮小、ドラッグ、全体表示が可能です。ノードにマウスをホバーすると、実行操作、論理操作、アクセスオブジェクト、予測読み取り行数、フィルター条件、Join 条件、データベースのネイティブ警告などの情報をさらに確認できます。ページには元のプランに実際に存在するフィールドのみが表示されます。
Rows と Cost の解釈
Estimated Rows はデータベースオプティマイザーが予測するノードの出力行数であり、実際に処理された行数ではありません。Node Cost は同じ実行プラン内の各ノードの相対コストを比較するためのもので、実際の実行所要時間を表すものではなく、異なるデータベース間での直接比較にも適しません。
ノードリスト¶
ノードリストは、実行プランのノード階層をインデント付きで表示し、各ノードがアクセスするオブジェクト、予測行数、ノードコストをすばやく比較するのに適しています。リストの順序はノード間の階層関係を表すものであり、実際の実行時間順ではありません。
| フィールド | 説明 |
|---|---|
| 実行ステップ | データベースが返した実行操作名とノード階層 |
| アクセスオブジェクト/インデックス | 現在のノードがアクセスするテーブル、ビュー、またはインデックス |
| Estimated Rows | データベースオプティマイザーが予測するノードの出力行数。元のプランに読み取り行数も含まれる場合は、出力データと読み取りデータがそれぞれ表示されます |
| Node Cost | 現在のノードとその子ノードの相対コスト |
XML / JSON¶
生ビューには、コレクターが取得した完全な実行プランが表示され、フォーマット、検索、コピー、ダウンロードに対応しています。
| データベース | 元の形式 | ダウンロード形式 |
|---|---|---|
| SQL Server | XML | ShowPlan XML 形式に一致する場合は .sqlplan、その他の XML は .xml としてダウンロード |
| MySQL | JSON | .json |
| PostgreSQL | JSON | .json |
| Oracle | JSON | .json |
実行プランデータの説明
実行プランはコレクターがすでに取得したデータに基づきます。システムはプラン確認のためにユーザー SQL を再実行せず、EXPLAIN や EXPLAIN ANALYZE を能動的に実行することもありません。実行プランはページで選択した現在の時間範囲に生成されたものとは限らず、特定の 1 回の実行に対応するとも限りません。実際の行数や実際の所要時間が含まれるかどうかは、データベースが返した元のプランによります。
指標の計算方法¶
クエリ分析の集約指標は、以下のロジックで計算されます。
| 指標 | 計算方法 |
|---|---|
| 実行回数 | すべてのインスタンス上でのこの種別のクエリの実行回数の累計 |
| 平均所要時間 | すべてのインスタンスの累計所要時間 ÷ すべてのインスタンスの累計実行回数 |
| 合計所要時間 | すべてのインスタンス上でのこの種別のクエリの所要時間の累計 |
| パフォーマンス負荷割合 | この種別のクエリの累計所要時間 ÷ 全クエリの累計所要時間 × 100% |
| 平均スキャン行数 | すべてのインスタンス上でのこの種別のクエリの平均スキャン行数の平均値 |
データの即時性について
クエリ分析のデータは、選択した時間範囲に基づいてリアルタイムに集約されます。選択した時間範囲内にデータの報告がないインスタンスは、集約結果に表示されません。