-- explain plan은 Optimizer에 의해 선택된 실행과정(Exeution Plan)에 대한
-- 정보를 테이블(plan_table)에 저장한다.
-- 하지만 plan_table은 기본 테이블로 설치 되지 않기 때문에 설치 해줘야 한다.
SQL> @c:\oracle\ora81\rdbms\admin\utlxplan.sql
-- 설치가 완료되면 plan_table 이 생성된다... ^^
SQL> desc plan_table;
이름 유형
------------------- -----------------
STATEMENT_ID VARCHAR2(30) -- 사용자가 지정한 제목
TIMESTAMP DATE -- 실행계획이 수립된 날짜와 시간
REMARKS VARCHAR2(80) -- 사용자가 부여한 주석(comments)
OPERATION VARCHAR2(30) -- AND-EQUAL,INDEX, SORT 등과 같은 실행 연산자
OPTIONS VARCHAR2(30) -- BY ROWID, JOIN, FULL 등과 같은 실행 옵션
OBJECT_NODE VARCHAR2(128) -- 사용한 데이타베이스 링크
OBJECT_OWNER VARCHAR2(30) -- 객체를 생성한 소유자
OBJECT_NAME VARCHAR2(30) -- 테이블, 인덱스, 클러스터 등의 객체의 이름
OBJECT_INSTANCE NUMBER(38) -- SQL문의 FROM절에 기술된 객체를 좌에서 우로 부여한 번호
OBJECT_TYPE VARCHAR2(30) -- UNIQUE, NON-UNIQUE INDEX 등의 객체의 종류
OPTIMIZER VARCHAR2(255) -- CHOOSE, FIRST_ROW 등의 현재의 옵티마이져 모드
SEARCH_COLUMNS NUMBER -- 현재 사용하지 않음
ID NUMBER(38) -- 수립된 각 실행단계에 붙여진 일련번호
PARENT_ID NUMBER(38) -- 부모단계의 일련번호
POSITION NUMBER(38) -- 부모 ID를 가지고 있는 자식 ID간의 처리순
COST NUMBER(38)
CARDINALITY NUMBER(38)
BYTES NUMBER(38)
OTHER_TAG VARCHAR2(255)
PARTITION_START VARCHAR2(255)
PARTITION_STOP VARCHAR2(255)
PARTITION_ID NUMBER(38)
OTHER LONG -- 다른 필요한 텍스트를 저장하기 위한 필드
DISTRIBUTION VARCHAR2(30)
-- 테스트 1
SQL> explain plan for select * from student;
해석되었습니다.
SQL> select operation, options, object_name, id, parent_id, position, optimizer
2 from plan_table order by id;
OPERATION OPTIONS OBJECT_NAME ID PARENT_ID POSITION OPTIMIZER
---------------- -------- ----------- ---- ---------- --------- ----------
SELECT STATEMENT 0 CHOOSE
TABLE ACCESS FULL STUDENT 1 0 1
-- 테스트 2
EXPLAIN PLAN
SET STATEMENT_ID = 'Emp_Sal'
FOR select * from student;
select count(*) from plan_table;
CREATE VIEW test AS
SELECT id, parent_id,
lpad(' ', 2*(level-1))||operation||' '||options||' '||object_name||' '||
decode(id, 0, 'Cost = '||position) "Query Plan"
FROM plan_table
START WITH id = 0 and statement_id = '[set statement_id 의 값을 적는다.]'
CONNECT BY prior id = [카운트의 결과를 적는다.] and statement_id = '[set statement_id 의 값을 적는다.]';
SELECT * FROM foo ORDER BY id, parent_id;
select * from test;
-- 테스트 3
select count(*) from plan_table;
SELECT LPAD(' ',2*(LEVEL-1))||operation||' '||options
||' '||object_name
||' '||DECODE(id, 0, 'Cost = '||position) "Query Plan"
FROM plan_table
START WITH id = 0 AND statement_id = '[set statement_id 의 값을 적는다.]'
CONNECT BY PRIOR id = [카운트의 결과를 적는다.] AND statement_id ='[set statement_id 의 값을 적는다.]';
다시 확인 하실때는 반드시
delete from plan_table;
commit;
실행 할때 나오게 하려면
set autot on exp;
이렇게 하면
sql던진 값이 나온후
바로 실행 계획이 나오네요
참조 : http://otn.oracle.com/doc/server.815/a67775/ch13_exp.htm#1110
[출처] Oracle Plan|작성자 헤르메스
SSISO Community