
実行計画の確認方法と注意点。データベースの最適化を図るには
データベースのパフォーマンス最適化や安定した運用管理を担うエンジニア・システム管理者にとって「実行計画」の理解は欠かせません。
実行計画を把握することで、SQLの処理手順やボトルネックを可視化し、チューニングや問題解決に役立てられます。
この記事では、実行計画の基本的な仕組みや生成の流れ、確認方法、そして注意点まで解説します。
データベースの効率的な運用についてはこちらの資料をご確認ください。
目次[非表示]
実行計画とは
実行計画とは、データベース管理システム(DBMS)がSQL文をどのような手順で処理するかを示した「処理手順書」のようなものです。同じSQLの結果を得る場合でも、テーブルの結合順序や検索方法、インデックスの利用有無によって内部的な実行手順は異なります。
DBMSは「オプティマイザ」と呼ばれる機能を用いて、テーブルやインデックスの統計情報(データ件数や分布など)をもとに複数の候補を比較し、最も効率的と判断される実行方法を「実行計画」として選択します。
実行計画を確認・理解することで、以下のような課題を発見できます。
不要なテーブルフルスキャン
インデックスの未活用
結合順序や結合方法の非効率さ
統計情報の不整合による誤ったアクセスパス
適切に実行計画を活用することで、SQLのボトルネックを特定し、効率的なチューニングが可能になります。
実行計画が生成される流れ
実行計画が生成される一般的な流れは、次のとおりです。
SQL文の解析:文法解析や構文解析を行い、SQLの意味を解釈する
統計情報の参照:テーブルやインデックスに関する情報を利用する
複数の実行パターンの評価:各候補のコストを見積もる
最適な実行計画の選択:最小コストと判断されたプランを採用する
上記一連のプロセスを担うのが、オプティマイザ(Optimizer) と呼ばれるコンポーネントです。
オプティマイザは、テーブルの行数やインデックスの有無、データの分布といった情報をもとに、SQLをどのように実行すれば効率的かを検討します。
結果、同じSQL文であっても、データベースの状態や利用可能なインデックス、統計情報の更新状況によって異なる実行計画が生成されることがあります。
実行計画の生成はSQLのパフォーマンスに大きく影響するため、SQLの書き方やデータベースの状態管理が非常に重要になります。
統計情報について
統計情報とは、データベース内のテーブルやインデックスに関するデータ件数や分布、カーディナリティ(値の種類数)などを表した情報です。オプティマイザは統計情報を基に、どのインデックスを利用するか、どの結合順序が効率的かを判断します。
統計情報が古い場合や不正確な場合、非効率なフルスキャンや不適切な結合方法が選ばれ、SQLパフォーマンスが大きく低下する可能性があります。そのため、定期的な統計情報の更新が不可欠です。
▼代表的な統計情報の種類と役割
統計情報の種類 | 説明・役割 |
行数(Row Count) |
|
カーディナリティ(Cardinality) |
|
分布情報(Histogram / Distribution) |
|
列統計(Column Stats) | 各列に関する平均値・最大値・最小値などを保持 |
索引統計(Index Stats) | インデックスの深さやクラスタ化因子を示し、アクセス効率の判断に利用 |
システム統計(System Stats) |
|
実行計画の確認方法
実行計画を確認する方法は、利用するデータベース製品によって異なります。
一般的には、SQL文の先頭に EXPLAIN や EXPLAIN PLAN を付与することで、実際にSQLを実行せずに処理手順を確認できます。
以下は、主要なRDBMSでの実行計画の確認方法をまとめた表です。
▼実行計画の確認方法
データベース | コマンド / ツール | 特徴・補足 |
Oracle | EXPLAIN PLAN FOR + SELECT * FROM PLAN_TABLE または DBMS_XPLAN.DISPLAY | 実行計画をPLAN_TABLE に格納し、後から参照可能 |
PostgreSQL | EXPLAIN / EXPLAIN ANALYZE | ANALYZEを付与すると実行時間や実際の行数も表示される |
MySQL | EXPLAIN | テーブルアクセス方法やインデックス利用状況を確認可能 |
SQL Server | SQL Server Management Studio (SSMS) の「実行プラン表示」機能 | GUIで実行計画を視覚的に確認できる |
その他ツール | A5:SQL Mk-2 など | GUIベースで複数DBに対応した可視化が可能 |
EXPLAIN PLANについて
EXPLAIN PLANは、Oracle Databaseで実行計画を取得するための代表的なコマンドです。
SQL文の前に「EXPLAIN PLAN FOR」を付与して実行すると、SQLがどのような手順で処理されるかを確認できます。取得された実行計画は PLAN_TABLE に格納され、SELECT 文や DBMS_XPLAN.DISPLAY を使って参照します。
実際にSQLを実行せずに最適化結果を確認できるため、チューニングやSQLの見直し時に非常に役立つのです。ただし、推定値をもとに生成されるため、実行時の統計情報やデータ状況によっては実際の挙動と差異が生じる場合があります。
▼EXPLAIN PLANのコマンド・関数と用途
コマンド・関数 | 用途 |
EXPLAIN PLAN FOR | SQLの実行計画を生成し、PLAN_TABLE に格納する |
SELECT * FROM PLAN_TABLE | 格納された実行計画を確認する基本的な方法 |
DBMS_XPLAN.DISPLAY | PLAN_TABLE の内容を見やすい形式で表示 |
EXPLAIN [ANALYZE] (PostgreSQL) | 推定値(EXPLAIN)や実際の実行結果(EXPLAIN ANALYZE)を確認 |
SSMSの実行プラン表示(SQL Server) | GUI上で実行計画を視覚的に確認 |
EXPLAIN (MySQL) | テーブルアクセス方法やインデックス利用状況を確認 |
実行計画に関する注意点
実行計画はSQLのパフォーマンスを最適化するうえで重要な情報ですが、いくつか注意点があります。
まず、実行計画は常に最適とは限らず、データベースの状態や統計情報の鮮度、実行時の環境要因によっては期待した結果が得られません。
また、EXPLAIN PLANで得られる計画は「予測」であり、実際にSQLが実行された際のプランとは異なることがあります。そのため、過信せず定期的な統計情報更新や実際の実行計画の確認が重要です。
必ずしも最適な処理が行えているとは限らない
オプティマイザは統計情報やシステムリソース、SQLの構造を基に実行計画を決定しますが、必ずしも最適なものが選ばれるとは限りません。
特に以下のケースでは、意図しないプランが選ばれパフォーマンスが低下することがあります。
複雑なクエリや大量データを扱う場合
統計情報が古い、または不正確な場合
特定のインデックスや結合順序が正しく評価されない場合
▼統計情報の新旧とその影響
統計情報の状態 | 影響 |
最新 | 実態に即した最適な実行計画が選ばれやすい |
古い / 不正確 | 不要なフルテーブルスキャンや誤ったインデックス利用が発生するリスクが高い |
パフォーマンス低下の対策としては、SQLの書き換えやインデックス追加、ヒント句の利用などがあります。
EXPLAIN PLANと実際の実行計画は異なる場合がある
EXPLAIN PLANで表示されるのはあくまで「予測値」であり、実際の実行計画とは異なることがあります。差が生じる主な要因は、以下のとおりです。
実行時のバインド変数の値
セッションレベルの初期化パラメータ
実行時のシステムリソース状況
したがって、チューニングの際には以下を意識する必要があります。
EXPLAIN PLANは目安である
実際の実行計画(OracleのDBMS_XPLAN.DISPLAY_CURSOR やAWRレポート)も確認する
適切な検索順序を誘導する
SQLの実行において、適切な検索順序が実行計画にて選択されない場合、「Hint句」を利用することで、強制的に検索順序を規定することができます。
Oracleデータベースに関しての「Hint句」に関しては、以下のブログに詳細にまとめていますので、よろしければご参照ください。
まとめ
この記事では、実行計画について以下の内容を解説しました。
実行計画の概要と役割
実行計画が生成される流れ
実行計画の確認方法(EXPLAIN/EXPLAIN PLANなど)
実行計画に関する注意点
実行計画は、SQLをどのような手順で実行するかを示す「処理手順書」であり、パフォーマンスチューニングやトラブルシューティングに不可欠な情報です。
オプティマイザは統計情報をもとに複数の候補から最適と判断される計画を選びますが、統計情報が古い場合や実行環境の違いによっては、必ずしも最適な処理が行われるとは限りません。そのため、SQLの書き方やインデックス設計に加え、定期的な統計情報の更新や実際の実行計画確認が重要です。
『日本エクセム』では、データベースの設計・構築から運用まで幅広くサポートを提供しています。特に、監視や日常運用、障害予防といった観点から安定的なデータベース運用を実現するノウハウを提供しており、情報システム部門の負担軽減にも貢献しています。
データベースの効率的な運用についてはこちらの資料をご確認ください。