侍エンジニア塾
Home » database » 実行計画(EXPLAIN PLAN)

実行計画(EXPLAIN PLAN)

実行計画(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処理が遅くなったと考えられます

思い当たる場合は実行計画をチェックするのもいいでしょう

 

 

rentry(PS4レンタル) rentry(スイッチレンタル) rentry rentry(VRレンタル)