AUTOTRACEはEXPLAIN PLANと異なり、実際にSQLを実行しシステムリソースの使用状況を取得しますので時間はかかりますが、性格なプランを確認する際はこちらを使用します。
12c以降のバージョンでは簡単に使えるようになっています。
たしか11gぐらいまでは、$ORACLE_HOME/rdbms/admin/utlxplan.sqlを実行し専用のテーブルを作成し、専用のロールを作成してとちょっと面倒でしたが、12c以降はSELECT_CATALOG_ROLEロールを対象のスキーマに付与してあげるだけで利用できるようです。(SELECT_CATALOG_ROLEにこだわらなくとも、おそらく以下3つのVIEWが参照できる権限さえあれば良いとおもいます。)
V_$SESSTAT
V_$MYSTAT
V_$STATNAME
以下の通り、何も権限を付与していない状況で利用を試みるとエラーがでます。
SQL> set autotrace on
SP2-0618: セッション識別子が見つかりません。PLUSTRACEロールが有効かを確認してください。
SP2-0611: STATISTICSレポートを使用可能にするときにエラーが発生しました。
SQL>
そこで、systemユーザから以下の通りSELECT_CATALOG_ROLEロールを付与すると利用できました。
grant SELECT_CATALOG_ROLE to scott ;
SQL> set autotrace on
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
7934 MILLER CLERK 7782 82-01-23 1300 10
12行が選択されました。
実行計画
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 468 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 12 | 468 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
統計
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
1291 bytes sent via SQL*Net to client
295 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
12 rows processed
SQL>