'오라클 실행계획(explan table) 보기(분석)'에 해당되는 글 1건

  1. 2009.08.12 오라클 실행계획(explan table) 보기(분석)
02.Oracle/DataBase2009. 8. 12. 15:58
반응형
오라클 실행계획(explan table) 보기.

작성자: 안창선(kabin@kldp.org)

오라클을 사용하면서 느낀것이 plan을 뜨는게 인포믹스보다 번거롭게 느껴지더군요.
그래서그런지 사용하는분을 별로 보지 못했습니다. 이제 아래 내용을 따라 하시면..
아주 쉽게 plan을 떠보고 SQL문을 튜닝하실 수 있을겁니다.

오라클은 실행계획이라는 것을 확인하여 성능을 측정할 수 있습니다.
엄밀히 말해 성능을 측정하는게 아니라 SQL리 인덱스를 적절히 쓰고 있는지
아니면 인덱스가 무시된체 full table scan을 하여 성능을 떨어뜨리게 되는지등을
확인하는 것입니다.(맞나?)

1. 우선 실행계획을 측정 하려면 실행계획을 확인한 자료를 오라클 DB에 저장할 수
있도록 실행계획 테이블을 만들어 줘야 합니다. 실행계획 테이블의 이름은 어떠한
이름을 가지고 있더라도 상관은 없지만 아래의 테이블 필드를 가지고 있어야
합니다. 따라서 실행계획을 확인하기 위한 첫 작업은 실행계획 테이블을 만드는
것이겠지요. 우리는 디폴트 이름은 PLAN_TABLE이라고 이름을 지읍시다.

create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns numeric,
id numeric,
parent_id numeric,
position numeric,
other long);
create unique index PLAN_TABLE_INDEX
on PLAN_TABLE ( statement_id, id)

2. 자 이제 실행계획 자료를 저장할 테이블을 만들었으니 이제 특정 SQL의
실행계획을 확인해 봅시다.

delete plan_table
/
EXPLAIN PLAN SET STATEMENT_ID = 'plan1' --> 해당실행문의 제목
INTO PLAN_TABLE
FOR
SELECT *
FROM test_table a
WHERE a.test like 'hi'||'%'
/

즉 위의 문장은 일단 실행계획테이블(plan_table)의 자료를 일단 모두 지운다음에.
plan1 ID로 문장을 지정하고 아래에 나오는 SQL문장의 결과를 PLAN_TABLE에
저장 하라는 명령입니다.

3. 이제 실행계획의 결과값을 봅시다.

결과값은 실행계획 테이블에 들어가 있습니다. 결과값을 보려면 아래의 SQL을
실행시켜 보십시오. 단 STATEMENT_ID와 PLAN_TABLE은 여러분이 정의한 것을
입력하셔야겠지요.

SELECT lpad(operation,length(operation)+2*(level-1)) ||
decode(id,0,'CostEstimate:'||decode(position,'0','N/A',position),null)||
''||options||
decode(object_name,null,null,':')||rpad(object_owner,length(object_name)+1,',')||
object_name||
decode(object_type,'unique','(U)','NON-UNIQUE',
'(NU)',null)||decode(object_instance,null,null,'('||object_instance||')')
FROM PLAN_TABLE
START with ID = 0 AND STATEMENT_ID = 'plan1'
CONNECT by prior ID = PARENT_ID and STATEMENT_ID = 'plan1'
/

4. 위의 결과값

예를 들어 이런 것이 나올 수 있습니다.

LPAD(OPERATION,LENGTH(OPERATION)+2*(LEVEL-1))||DECODE(ID,0,'COSTESTIMATE:'||DECO
--------------------------------------------------------------------------------
SELECT STATEMENTCostEstimate:
TABLE ACCESSBY INDEX ROWID:HDMF,,,,,,,,W5_CARVAL_T(1)
INDEXRANGE SCAN:HDMF,,,,,,,,,,,,,,,,,,W5_CARVAL_T_CNAME_IDX(NU)

여기 위를 보면 accessby index 어쩌구 나오지요? 즉 인덱스를 사용하고 있다는
겁니다.
그리고 그 인덱스는 W5_CARVAL_T_CNAME_IDX을 쓰고 있다고 하는 것이구요.

만약 내용이

LPAD(OPERATION,LENGTH(OPERATION)+2*(LEVEL-1))||DECODE(ID,0,'COSTESTIMATE:'||DECO
--------------------------------------------------------------------------------
SELECT STATEMENTCostEstimate:
TABLE ACCESSFULL:HDMF,,,,,,,,W5_CARVAL_T(1)

이런 식으로 나오면 인덱스를 전혀 사용하지 못하고 테이블을 일일이 뒤진다는
거지요.
위에 보면 accessfull이라는게 있지요. 즉 테이블을 전체 검색하고 있다는 뜻입니다.
 
Posted by 1010