우리 회사 데이터베이스를 티베로로 변경하기
Explain Plan 0 0 99,999+

by 티베로 티베로 실행계획 [2018.10.11]


예상 실행계획을 저장하기 위해서는 다음과 같이 EXPLAIN PLAN ~ FOR 명령어 를 사용해 PLAN_TABLE에 저장하고 알맞은 형태로 포맷팅을 해주는 쿼리를 사용 하여 조회를 하면 된다.

PLAN_TABLE은 티베로 설치 시 SYS OWNER 계정으로 생성되고, PUBLIC SYNONYM과 GRANT를 부여하므로 별도의 권한 없이 조회가 가능하다.

$TB_HOME/scripts/plan_table.sql의 생성 스크립트를 확인해보면 PLAN_TABLE은 GLOBAL TEMPORARY TABLE이며 ON COMMIT PRESERVE ROWS 옵션이 적용되므로 각 세션별로 자기만의 PLAN을 TEMP TABLESPACE에 저장하게 되고 세션이 종료되면 저장된 PLAN들은 삭제되므로 데이터베이스 관리자는 PLAN_TABLE에 대해서 신경 쓸 일이 전혀 없다

(간혹 TOOL에서 해당 TOOL 계정으로 PLAN_TABLE을 생성하는 경우가 있는데 전혀 필요하지 않고 중복 OBJECT만 늘어나게 되므로 DROP하는 것이 바람직하다)

한편, 티베로에서 제공하는 Tibero Admin이나 Orange와 같은 GUI TOOL에서 간편하게 icon click 혹은, 단축키를 통해 예상 실행계획 확인이 가능한데 이러한 Tool들도 EXPLAIN PLAN 명령을 통해 저장하고 PLAN_TABLE을 조회하여 보여 주는 원리는 동일하다.

#실행 문법 EXPLAIN PLAN SET STATEMENT_ID = '식별ID' FOR [대상SQL] ;

1) 테스트 계정 및 테이블 생성

@tibero:/tibero/tibero6/scripts # tbsql sys/*****

CREATE USER TIBEROTEST IDENTIFIED BY 'tibero' DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK;
GRANT CONNECT TO TIBEROTEST;
GRANT CREATE TABLE TO TIBEROTEST;

@tibero:/tibero/tibero6/scripts # tbsql tiberotest/tibero
CREATE TABLE TIBEROTEST.CODE
(
 GROUP_CD VARCHAR2(5 BYTE) ,
 COMMON_CD VARCHAR2(15 BYTE) ,
 CODE_NM VARCHAR2(100 BYTE) ,
 CODE_SHTNM VARCHAR2(100 BYTE)
);

Insert into TIBEROTEST.CODE(GROUP_CD,COMMON_CD,CODE_NM,CODE_SHTNM)
Values('1111','01','테스트1','테스트1');
Insert into TIBEROTEST.CODE(GROUP_CD,COMMON_CD,CODE_NM,CODE_SHTNM)
Values('1112','02','테스트1','테스트1');
Insert into TIBEROTEST.CODE(GROUP_CD,COMMON_CD,CODE_NM,CODE_SHTNM)
Values('1113','03','테스트1','테스트1');
Insert into TIBEROTEST.CODE(GROUP_CD,COMMON_CD,CODE_NM,CODE_SHTNM)
Values('1114','04','테스트1','테스트1');

2) 테스트 계정 로그인 및 예상 실행계획 저장 및 확인
@tibero:/tibero/tibero6/scripts # tbsql tiberotest/tibero

EXPLAIN PLAN SET STATEMENT_ID='TIBEROPLAN01'
FOR select sum(1) from code;

SELECT
SUBSTRB(TO_CHAR(ID),1,3) || LPAD(' ', LEVEL * 4) || UPPER(OPERATION) ||
DECODE(OBJECT_NAME, NULL, NULL, ':' ||OBJECT_O WNER||'.'||OBJECT_NAME) ||
'(COST:' || COST || ',CARD:' || CARDINALITY || ')' ||
DECODE(PARTITION_START, '', '', '(PS:' || PARTITION_START || ',PE:' ||
PARTITION_END || ')') AS "Plan"
FROM PLAN_TABLE
START WITH STATEMENT_ID = 'TIBEROPLAN01'
AND DEPTH = 1 CONNECT BY PRIOR ID = PARENT_ID
AND PRIOR SQL_ID = SQL_ID AND PRIOR CHILD_NUMBER = CHILD_NUMBER
ORDER SIBLINGS BY POSITION
;

3) 예상 실행계획 확인결과
Plan
1 COLUMN PROJECTION(COST:132,CARD:1)
2 SORT AGGR(COST:132,CARD:1)
3 TABLE ACCESS (FULL):TIBEROTEST.CODE(COST:132,CARD:19239)

note : TABLE의 예상 ROWS를 나타내는 Card의 수치를 티베로 옵티마이저가 19239로 추측한 이유는 TESTTABLE인 CODE를 생성하고 통계 정보를 수집하지 않아 해당 테이블의 물 리적인 BLOCK 개수를 가지고 ROWS를 추측했기 때문이다. 따라서 잘못된 예측 정보를 가지고 성능이 좋지 않은 플랜을 생성할 수 있으니 최적의 플랜을 위해서는 주기적으로 통계 수집을 해주는 것이 굉장히 중요하다.

---통계 정보수집 후 재조회하면 올바른 예측치가 추출된다.
execute DBMS_STATS.GATHER_TABLE_STATS('TIBEROTEST', 'CODE', estimate_percent=>100 );

Plan
1 COLUMN PROJECTION(COST:132,CARD:1)
2 SORT AGGR(COST:132,CARD:1)
3 TABLE ACCESS(FULL):TIBEROTEST.CODE(COST:132,CARD:4)

  • - 해당 강좌는 도서 " [우리 회사 데이터베이스를 티베로로 변경하기]"의 내용을 옮겼습니다.
  • - 해당 도서는 기간계 DBMS(DATABASE MANAGEMENT SYSTEM)를 티베로로 전환하는 실제 프로젝트를 수행한 실무자가 DBMS 전환 과정과 실제 적용 사례, 문제 해결 과정 등을 자세하게 설명하고 있습니다.

- 강좌 URL : http://www.gurubee.net/lecture/4151

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입