GAGA LIFE.

DBAブログ

Oracle 実行計画解析のリファレンス

概要

Oracleで実行計画を読み解く際のリファレンスを記載します。

実行計画のビュー

View Description
V$SQL_SHARED_CURSOR 特定の子カーソルが既存の子カーソルと共有されない理由を示します。
それぞれの列は、カーソルが共有されない具体的な理由を示します。
USE_FEEDBACK_STATS列には、再最適化のために子カーソルが一致していないかどうかが示されます。
V$SQL_PLAN すべての最終計画で使用されているすべての行のスーパーセットが含まれます。
PLAN_LINE_IDには連番が振られますが、単一の最終計画では、IDが連番にならない場合もあります。
V$SQL_PLAN_STATISTICS_ALL (ソートまたはハッシュ結合に)SQLメモリーを使用する行ソースのメモリー使用量統計が含まれます。
このビューは、V$SQL_PLAN内の情報をV$SQL_PLAN_STATISTICSおよび
V$SQL_WORKAREAからの実行統計と連結します。

EXPLAIN PLANによって生成されるOPERATION値とOPTIONS値

Operation Option Description
AND-EQUAL   複数のROWIDのセットを受け取り、重複をなくして、そのセットの共通部分を戻す処理。
この処理は単一列索引のアクセス・パスに対して使用されます。
BITMAP CONVERSION TO ROWIDSは、ビットマップ表現を、表にアクセスするために使用できる実際のROWIDに変換します。
FROM ROWIDSは、ROWIDをビットマップ表現に変換します。
COUNTは、実際の値を必要としない場合にROWIDの数を戻します。
INDEX SINGLE VALUEは、索引内の単一のキー値のビットマップを参照します。
RANGE SCANは、ある範囲のキー値のビットマップを取り出します。
FULL SCANは、開始キーまたは終了キーがない場合にビットマップ索引の全体スキャンを実行します。
MERGE レンジ・スキャンの結果の複数のビットマップを1つのビットマップにマージします。
MINUS 片方のビットマップのビットを、もう一方のビットマップから減算します。行ソースは否定述語に対して使用されます。
このオプションは、減算が発生する可能性があるビットマップを作成する非否定述語がある場合にのみ使用できます。
OR 2つのビットマップのビット単位のORを計算します。
AND 2つのビットマップのビット単位のANDを計算します。
KEY ITERATION 表の行ソースから各行を取り出し、ビットマップ索引から対応するビットマップを検索します。
その後、このビットマップのセットは、次のBITMAP MERGE操作で1つのビットマップにマージされます。
CONNECT BY   CONNECT BY句を含んでいる問合せについて階層順に行を取り出します。
CONCATENATION   複数の行のセットを受け取り、そのセットのUNION-ALLを戻す処理。
COUNT   表から選択された行の数をカウントする処理。
STOPKEY 戻される行数をWHERE句のROWNUM式によって制限するカウント処理。
CUBE JOIN   左側の表またはビューおよび右側のキューブを結合します。
NO_USE_CUBEおよびUSE_CUBEヒントの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ANTI 左側の表またはビューおよび右側のキューブに対してアンチ結合を使用します。
ANTI SNA 左側の表またはビューおよび右側のキューブに対してアンチ結合(片面NULL対応)を使用します。
右側の結合列(キューブ側)はNOT NULLです。
OUTER 左側の表またはビューおよび右側のキューブに対して外部結合を使用します。
RIGHT SEMI 左側の表またはビューおよび右側のキューブに対して右側セミ結合を使用します。
CUBE SCAN   すべてのキューブ・アクセスで内部結合を使用します。
PARTIAL OUTER 少なくとも1つのディメンションで外部結合を使用し、その他のディメンションで内部結合を使用します。
OUTER すべてのキューブ・アクセスで外部結合を使用します。
DOMAIN INDEX   ドメイン索引からの1つ以上のROWIDの取出し。
オプション列には、ユーザー定義ドメイン・インデックス・コスト関数から与えられた情報が含まれています。
FILTER   行のセットを受け取り、そのいくつかを取り除き、残りを戻す処理。
FIRST ROW   問合せで選択される最初の行のみの取出し。
FOR UPDATE   FOR UPDATE句が含まれている問合せによって選択される行を取り出し、ロックする処理。
HASH GROUP BY GROUP BY句を持つ問合せで、行のセットを複数のグループにハッシュする処理。
GROUP BY PIVOT GROUP BY句を持つ問合せで、行のセットを複数のグループにハッシュする処理。
PIVOT操作は、HASH GROUP BY演算子のピボット固有の最適化を示します。
HASH JOIN
(結合操作)
  2つのセットの行を結合し、結果を戻す操作。この結合方法は、データのラージ・データ・セット(DSSやバッチなど)の結合に役立ちます。
この結合条件は、第2の表にアクセスする場合に有効です。
問合せオプティマイザは、2つの表またはデータ・ソースの小さいほうを使用して、メモリー内に結合キーについてのハッシュ表を作成します。
次に、大きいほうの表をスキャンし、ハッシュ表を調べて結合された行を見つけます。
ANTI ハッシュ(左側)アンチ結合
SEMI ハッシュ(左側)セミ結合
RIGHT ANTI ハッシュ右側アンチ結合
RIGHT SEMI ハッシュ右側セミ結合
OUTER ハッシュ(左側)外部結合
RIGHT OUTER ハッシュ(右側)外部結合。
INDEX
(アクセス方法)
UNIQUE SCAN 索引からの単一のROWIDの取出し。
RANGE SCAN 索引からの1つ以上のROWIDの取出し。索引値は昇順でスキャンされます。
RANGE SCAN DESCENDING 索引からの1つ以上のROWIDの取出し。索引値は降順でスキャンされます。
FULL SCAN スタート・キーおよびストップ・キーがない場合の、索引からのすべてのROWIDの取得。
索引値は昇順でスキャンされます。
FULL SCAN DESCENDING スタート・キーおよびストップ・キーがない場合の、索引からのすべてのROWIDの取得。
索引値は降順でスキャンされます。
FAST FULL SCAN マルチブロックREADを使用した全ROWID(および列の値)の取得。
ソート順は定義できません。
索引付けされた列に対してのみ、全表スキャンと比較されます。
コストベース・オプティマイザでのみ使用可能です。
SKIP SCAN 索引内の先頭列を使用しない、連結索引からのROWIDの取得。
コストベース・オプティマイザでのみ使用可能です。
INLIST ITERATOR   INリスト述語内の各値に対して、計画内の次の操作を反復します。
INTERSECTION   2つの行のセットを受け取り、重複をなくして、そのセットの共通部分を戻す処理。
MERGE JOIN
(結合操作)
  2つの行のセットを受け取り、それぞれを特定の値でソートし、一方のセットの各行を他方の行と突き合せて結合し、その結果を戻す処理。
OUTER 外部結合文を実行するマージ結合処理。
ANTI マージ・アンチ結合
SEMI マージ・セミ結合
CARTESIAN 文中に他の表への結合条件を持たない1つ以上の表について発生する操作です。
結合とともに発生する可能性がありますが、計画内ではCARTESIANとフラグが付かないことがあります。
CONNECT BY   CONNECT BY句を含んでいる問合せに対する、階層順での行の取出し。
MAT_VIEW REWITE ACCESS
(アクセス方法)
FULL マテリアライズド・ビューのすべての行の取出し。
SAMPLE マテリアライズド・ビューのサンプル行の取出し。
CLUSTER 索引クラスタのキーの値に基づいた、マテリアライズド・ビューからの行の取出し
HASH ハッシュ・クラスタのキーの値に基づいた、マテリアライズド・ビューからの行の取出し。
BY ROWID RANGE ROWID範囲に基づいたマテリアライズド・ビューからの行の取出し
SAMPLE BY ROWID RANGE ROWID範囲に基づいたマテリアライズド・ビューからのサンプル行の取出し
BY USER ROWID ユーザー指定のROWIDを使用してマテリアライズド・ビューの行が指定される場合
BY INDEX ROWID マテリアライズド・ビューがパーティション化されておらず、索引を使用して行が指定される場合
BY GLOBAL INDEX ROWID マテリアライズド・ビューがパーティション化されており、グローバル索引のみを使用して行が指定される場合
BY LOCAL INDEX ROWID マテリアライズド・ビューがパーティション化されており、1つ以上のローカル索引と、場合によっては
いくつかのグローバル索引を使用して行が指定される場合。
パーティション区間:
パーティション区間は次のようにして計算されている可能性があります。
前のPARTITIONステップによって決定される場合。この場合、PARTITION_START列の値とPARTITION_STOP列の値はPARTITIONステップ内の値をレプリケートし、PARTITION_IDにはPARTITIONステップのIDが組み込まれます。
PARTITION_STARTおよびPARTITION_STOPに使用できる値は、NUMBER(n)、KEYおよびINVALIDです。
MAT_VIEW REWRITE ACCESSまたはINDEXステップ自体で決定される場合。この場合、PARTITION_IDにはそのステップのIDが組み込まれます。PARTITION_STARTおよびPARTITION_STOPに使用できる値は、NUMBER(n)、KEY、ROW REMOVE_LOCATION(MAT_VIEW REWRITE ACCESSのみ)およびINVALIDです。
MINUS   2つの行のセットを受け取り、最初のセットにあって2番目のセットにない行を戻して、重複をなくす処理
NESTED LOOPS
(結合操作)
  外側のセットと内側のセット、2つの行のセットを受け取る処理。Oracle Databaseは、外側のセットの各行を内側のセットの各行と比較し、条件を満たす行を戻します。この結合方法は、小さいサブセットのデータを結合する場合(OLTP)に役立ちます。
この結合条件は、第2の表にアクセスする場合に有効です。
OUTER 外部結合文を実行するネステッド・ループ操作
PARTITION   PARTITION_START列およびPARTITION_STOP列によって指定された範囲の各パーティションに対して、計画内の次の操作を反復します。
PARTITIONは、単一のパーティション・オブジェクト(表または索引)や同一レベル・パーティション・オブジェクトのセット(パーティション表やそのローカル索引)に適用できるパーティションの区間を示します。パーティションの区間は、PARTITIONのPARTITION_STARTおよびPARTITION_STOPの値で指定されます。パーティションの開始および終了の有効な値は、表7-4を参照してください。
SINGLE 1つのパーティションへのアクセス
ITERATOR 多数のパーティション(サブセット)へのアクセス
ALL すべてのパーティションへのアクセス
INLIST INリスト述語を基準にしたイテレータに類似するもの
INVALID アクセスするよう設定されているパーティションが空であることを示します
PX ITERATOR BLOCK、CHUNK パラレル実行サーバー・セット間でのブロックまたはチャンク範囲へのオブジェクトの分割を実装します
PX COORDINATOR   パラレル実行サーバーを使用して下位のパラレル計画を制御、スケジュールおよび実行する問合せコーディネータを実装します。
また、パラレルに実行され、常に下位にPX SEND QC操作を持つ計画部分の終わりとして、シリアライズ・ポイントを表します。
PX PARTITION   セマンティクスは通常のPARTITION操作と同じですが、パラレル計画に表示されます。
PX RECEIVE   PX SENDノード上で実行される送信側/プロデューサ(QCまたはパラレル実行サーバー)から再パーティション化されたデータを読み取る、コンシューマ/受信側パラレル実行ノードを示します。以前は、この情報はDISTRIBUTION列に表示されていました。
PX SEND QC (RANDOM)、HASH、RANGE スレーブの2つのパラレル実行サーバー・セットの間における配分方法を実装します。2つのセット間の境界と、送信側/プロデューサ側(QCまたはスレーブ)でのデータのパーティション化方法を示します。
以前は、この情報はDISTRIBUTION列に表示されていました。
REMOTE   リモート・データベースからのデータの取出し
SEQUENCE   順序値のアクセスを伴う処理
SORT AGGREGATE 選択した行のグループにグループ関数を適用した結果として取得される単一行の取出し
UNIQUE 行のセットをソートし、重複をなくす処理
GROUP BY GROUP BY句を持つ問合せで、行のセットを複数のグループにソートする処理
GROUP BY PIVOT GROUP BY句を持つ問合せで、行のセットを複数のグループにソートする処理。
PIVOT操作は、SORT GROUP BY演算子のピボット固有の最適化を示します。
JOIN マージ結合の前に、一連の行をソートする操作
ORDER BY ORDER BY句を持つ問合せに対して行のセットをソートする処理
TABLE ACCESS
(アクセス方法)
FULL 表のすべての行の取出し
SAMPLE 表のサンプル取得された行の取出し
CLUSTER 索引クラスタのキーの値に基づいた、表からの行の取出し
HASH ハッシュ・クラスタのキーの値に基づいた、表からの行の取出し
BY ROWID RANGE ROWID範囲に基づいた表からの行の取出し
SAMPLE BY ROWID RANGE ROWID範囲に基づいた表からのサンプル行の取出し
BY USER ROWID ユーザー指定のROWIDを使用して表の行が指定される場合
BY INDEX ROWID 表がパーティション化されておらず、索引を使用して行が指定される場合
BY GLOBAL INDEX ROWID 表がパーティション化されており、グローバル索引のみを使用して行が指定される場合
BY LOCAL INDEX ROWID 表がパーティション化されており、1つ以上のローカル索引と場合によってはいくつかのグローバル索引を使用して、行が指定される場合。
パーティション区間:
パーティション区間は次のようにして計算されている可能性があります。
前のPARTITIONステップによって決定される場合。この場合、PARTITION_START列の値とPARTITION_STOP列の値はPARTITIONステップ内の値をレプリケートし、PARTITION_IDにはPARTITIONステップのIDが組み込まれます。
PARTITION_STARTおよびPARTITION_STOPに使用できる値は、NUMBER(n)、KEYおよびINVALIDです。
TABLE ACCESSまたはINDEXステップ自体で決定される場合。この場合、PARTITION_IDにはそのステップのIDが組み込まれます。PARTITION_STARTおよびPARTITION_STOPに使用できる値は、NUMBER(n)、KEY、ROW REMOVE_LOCATION(TABLE ACCESSのみ)およびINVALIDです。
TRANSPOSE   GROUP BYの結果を入れ換えて最終的にピボットされたデータを生成するPIVOT操作を評価する操作
UNION   2つの行のセットを受け取り、重複をなくして、そのセットの連結結果を戻す処理
UNPIVOT   列から行にデータを回転させる操作
VIEW   ビューの問合せを実行し、結果の行を別の処理に戻す処理

参考資料

https://docs.oracle.com/cd/E82638_01/TGSQL/reading-execution-plans.htm#GUID-7957B335-D36A-42BF-96BB-FF47FFBA4DFD
Oracle® Database SQLチューニング・ガイド 12cリリース2 (12.2)
7 実行計画の読取り