DBMS_XPLAN.DISPLAY_CURSOR는 이미 수행된 SQL의 PLAN을 확인할 수 있는 장점이 있다.
이미 수행된 SQL은 V$SQL을 조회하여 확인할 수 있다
SQL> SELECT *
FROM EMP E
WHERE E.EMPNO = 9999999
AND E.DEPTNO = 10
no rows selected
SQL> SELECT SUBSTR(SQL_TEXT, 1, 30) SQL_TEXT,
SQL_ID, CHILD_NUMBER
FROM V$SQL
WHERE SQL_TEXT LIKE 'SELECT * FROM EMP E%';
SQL_TEXT SQL_ID CHILD_NUMBER
------------------------------ ------------- ------------
SELECT * FROM EMP E WHERE E ak7vxhj055996 0
-- V$SQL에서 조회 한 SQL_ID, CHILD_NUMBER를 입력한다.
SQL> SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('ak7vxhj055996', 0, 'ALLSTATS LAST'));
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 26 | 3 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | EMP_U1 | 1 | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("E"."DEPTNO"=10)
2 - access("E"."EMPNO"=9999999)
Note
-----
- Warning: basic plan statistics not available. These are only collected when:
* hint 'gather_plan_statistics' is used for the statement or
* parameter 'statistics_level' is set to 'ALL', at session or system level
-- 세션 레벨의 파라미터 변경 SQL> ALTER SESSION SET STATISTICS_LEVEL = ALL; -- 1번 단계의 SQL문장을 다시 실행 SQL> SELECT * FROM EMP E WHERE E.EMPNO = 9999999 AND E.DEPTNO = 10; no rows selected -- 2번 단계의 SQL_ID 확인 SQL> SELECT SUBSTR(SQL_TEXT, 1, 30) SQL_TEXT, SQL_ID, CHILD_NUMBER FROM V$SQL WHERE SQL_TEXT LIKE 'SELECT * FROM EMP E%'; SQL_TEXT SQL_ID CHILD_NUMBER ------------------------------ ------------- ------------ SELECT * FROM EMP E WHERE E ak7vxhj055996 0 SELECT * FROM EMP E WHERE E ak7vxhj055996 1 -- 1번의 CHILD_NUMBER 추가 확인 됨. -- 동일한 SQL을 ‘STATISTICS_LEVEL' 값을 변경하여 수행하였기 때문에 CHILD_NUMBER 값으로 구분
SQL> SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('ak7vxhj055996', 1, 'ALLSTATS LAST'));
-- 실제 수행한 결과
---------------------------------------------------------------------------------------
|Id | Operation | Name | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 0 |00:00:00.01 | 4 |
|* 2 | INDEX UNIQUE SCAN | EMP_U1 | 1 | 1 |00:00:00.01 | 3 |
---------------------------------------------------------------------------------------
-- 예측 결과
-------------------------------------------------------
|Id | Operation | Name | E-Rows |
-------------------------------------------------------
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 |
|* 2 | INDEX UNIQUE SCAN | EMP_U1 | 1 |
-------------------------------------------------------
-- 예측 실행계획과 실제 실행계획 비교
- A-Rows, A-Time, Buffer 추가 정보 보여줌
- E : Estimate, A : Actual
- 강좌 URL : http://www.gurubee.net/lecture/2138
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.