Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-27
제목 EXPLAIN PLAN 을 자동으로 수행하는 방법
EXPLAIN PLAN 을 자동으로 수행하는 방법
======================================

Purpose
-------
이 자료에서는 sql*plus 에서 자동으로 explain plan 을 만드는 방법을
설명한다. 이 방법으로 explain 을 실행하는 구문을 기억할 필요없이 현재
수행하는 sql 문장을 쉽게 체크해 볼 수 있다.

Explanation
-----------
아래의 script를 실행하기 전에 사용하고자 하는 user로 sqlplus login한 후
$ORACLE_HOME/rdbms/admin/utlxplan.sql을 수행하여 plan_table을 생성한다.

다음이 script 의 내용이다.

단, 이 때 --로 시작하는 comment로 인해 error가 발생하는 수도 있으므로,
오류가 발생하면 --로 시작하는 comment를 모두 제거하고 수행하면 된다.

save toto repl -- Save current script
truncate table plan_table; -- Clean Plan Table
get toto nolist -- Restore script

1 -- setup explain statement
-- 영문자 l이 아니고 숫자 1이다.
ch //explain plan set statement_id='MyTest' for /
/
-- Go!
select lpad(' ',2*(level-1))|| operation||' '||
options||' '||object_name||
' '||object_type||' '||object_instance||' '||
decode(id,0,'Cost = '||position) "Query Plan"
from plan_table
start with id = 0 -- start with statement_id = 'MyTest'
connect by prior id = parent_id;

get toto nolist -- Restore script



Example
-------

위의 script 를 'plan.sql' 이라는 화일로 저장한 후 sql*plus에서 실행한다.

SQL> select * from dept;

DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> @plan
Wrote file toto

Table truncated.

1* select * from dept
1* explain plan set statement_id='MyTest' for select * from dept

Explained.

Query Plan
----------------------------------------------------------------------
SELECT STATEMENT Cost = 1
TABLE ACCESS FULL DEPT 1

Script 는 plan.sql 로 저장 되어 있으므로 user 는 buffer 를 query 해서
어느 정도의 수정을 가할수 있다.

SQL> l
1* select * from dept
SQL> i
2 where deptno =20;

DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH DALLAS

SQL> @plan
Wrote file toto

Table truncated.

1* select * from dept
1* explain plan set statement_id='MyTest' for select * from dept

Explained.


Query Plan
----------------------------------------------------------------------
SELECT STATEMENT Cost = 1
TABLE ACCESS BY ROWID DEPT 1
INDEX UNIQUE SCAN DEPT_PRIMARY_KEY UNIQUE
----------------------------------------------------------------------
Comment
등록된 코멘트가 없습니다.