EXPLAIN PLANで実行計画(予定)を取得するのでははく、これは実際に動作したあと、「どのようなアクセスパスであったか」を出力します。その昔は、V$SQL_PLANを参照していましたが、こちらのほうが使い勝手よくなりました。ただしV$SQL等と同様にライブラリキャッシュに残存している間のみ有効です。
第1パラメータはSQL_ID
第2パラメータはchild No 省略するとデフォルト0を採用
DBMS_XPLAN.DISPLAY_CURSOR()を使って実行時のプランを取得する
select * from table(DBMS_XPLAN.DISPLAY_CURSOR('dw5a4prnbfuw5', 0)) ;
PLAN_TABLE_OUTPUT
SQL_ID dw5a4prnbfuw5, child number 0
-------------------------------------
select /* コメント1 */ * from PRODUCT_MST t order by t.CODE desc
Plan hash value: 234484996
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| PRODUCT_MST | 4 | 104 | 2 (0)| 00:00:01 |
| 2 | INDEX FULL SCAN DESCENDING| PK_PRODUCT_MST | 4 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
呼び出しパラメータに「format=>’ALL LAST PEEKED_BINDS’」 をつけると、バインド変数の値を表示する事ができます。
select * from table(DBMS_XPLAN.DISPLAY_CURSOR('dw5a4prnbfuw5', 0,format=>'ALL LAST PEEKED_BINDS')) ;
おまけ:SQL_IDとCHILD_NOを取得する方法
実際に利用する際はまず、SQL_IDとCHILD_NOを取得しないといけませんが、私は以下のようにSQLの中にコメントを入れて、V$SQLからこのコメントをキーに取得しています。具体的には以下の通り。
-- 実行計画を取得したいSQLにコメント(後に検索キーとして利用)を含めて実行 select /* コメント1 */ * from PRODUCT_MST t order by t.CODE desc ;
次にV$SQLを検索してSQL_IDとCHILD_NOを取得する。以下SQLは複数行結果セットが返されますが、最上位に出力されたものが対象になります。(検索キーは他と被らないように気を付けましょう)
select s.SQL_ID,s.CHILD_NUMBER,s.SQL_TEXT from v$sql s where s.SQL_TEXT like '%コメント1%' order by s.LAST_ACTIVE_TIME ;
SQL_ID CHILD_NUMBER SUBSTR(S.SQL_TEXT,1,40)
dw5a4prnbfuw5 0 select /* コメント1 */ * from PRODUCT_MST t
aufbvg617btw4 0 select s.SQL_ID,s.SQL_TEXT from v$sqlsta
SQL_ID CHILD_NUMBER SUBSTR(S.SQL_TEXT,1,60)