実行計画(EXPLAIN PLAN)についての解説
実行計画(EXPLAIN PLAN)は、OracleがSQLを実行するための仕組みでパフォーマンス分析に役立ちます。実行計画(EXPLAIN PLAN)の分析方法を理解することでSQL作成時のパフォーマンスの妥当性を知ることが可能となります
実行計画(EXPLAIN PLAN)とは
厳密に言うと実行計画(EXPLAIN PLAN)は、SQLを実行する時のアクセスパスです。つまりデータの処理の仕方です。以下が実行計画の出力例です。COSTがコスト値と言って、SQLを実行する上での重みです。実行計画を分析する場合、まずこの数値の大きさから見ます
実行計画EXPLAIN PLAN)の例
Idは処理の順番です
Operationはアクセスパスです
Nameはその処理で使用しているオブジェクト名(テーブル名やインデックス名)です
Rowsは対象処理行数です
Bytesは処理バイト数です
CPUはCPU時間です
Timeはエラプス時間です
CostはOracleが統計情報から独自に算出している値で、いわゆる処理の重みです
このCost値が大きいとコンピュータリソースに与える影響が大きい、つまりパフォーマンスに影響するということです
通常数10から数100程度でしょう。一般的に1000を超えると遅くなってきます。5000を超えると、かなり重たいSQLと言え、パフォーマンスチューニング対象と考えられます
実行計画妥当性の判断ポイント
1.データアクセス方法
表フルスキャン (TABLE ACCESS FULL)は全表走査です。処理が遅いイメージがありますが、データ量が少ない等、フルスキャンのほうが早い場合がありますので、OracleがCostを計算して、表フルスキャン (TABLE ACCESS FULL)を選択しているということです
索引のレンジスキャン (INDEX RANGE SCAN)は、SQL条件で範囲選択されている場合に使用されます。 索引には索引列がソートして格納されているため、索引を使用してORDER BY句を満たせる場合はソート処理を回避できます
索引の一意スキャン (INDEX UNIQUE SCAN)は、SQL条件で単一選択(等価結合)される場合に使用されます
索引のフルスキャン (INDEX FULL SCAN)は、SELECT句で指定した列が全て索引列に含まれており、かつソートが発生する場合に使用されます。 表フルスキャンするのではなく、ソート済みの索引をフルスキャンすることで、ソート処理を回避できます
2.結合方法、結合順序
ネステッドループ結合(NESTED LOOP)は、最初に外部表にアクセスし、外部表から戻された行数分、内部表にアクセスして条件に合致するデータを戻します
チューニングのポイントとしては、カーディナリティの小さい表を外部表とし、内部表のアクセス効率を上げる
内部表の結合列に索引があると効率的です
ハッシュ結合(HASH JOIN)は、以下の順序で処理されます
(1)表1から抽出条件に合致する結果セットを返す
(2)結果セットの結合キーをもとにハッシュ表をPGA内に作成する
(3)表2から絞込条件に合致する結果セットを返す
結果セットの結合キーを順にハッシュし、ハッシュ表と照らし合わせて結合条件に合致する行を特定します
チューニングのポイントとしては、以下の通りです
(1)PGA上のハッシュ表を小さくするために、カーディナリティの小さい方を先に処理する
(2)ハッシュ表がPGA内に収まらない場合、一時表領域を使用するため、ディスクIOにより性能劣化する
(3)結合条件が等価結合でない場合(範囲指定など)、ハッシュ結合は行われない
(4)アクセス方法は必ずフルスキャンになる
よく、今まで正常に動いていたSQLが遅くなったという話を聞きますが、最も有力な原因は、統計情報が変更された結果、OracleのCost値が上がり、SQL処理が遅くなったと考えられます
思い当たる場合は実行計画をチェックするのもいいでしょう