예상 실행계획을 저장하기 위해서는 다음과 같이 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] ;
@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');
@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 ;
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)
- 강좌 URL : http://www.gurubee.net/lecture/4151
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.