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
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.