SSISO Community

시소당

Oracle Plan

-- 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

1253 view

4.0 stars