autotrace나 sql trace를 수행하기 위해선 tbsql을 수행하거나 OS의 tracefile을 확인해야 하므로 tbAdmin, Orange와 같은 GUI Tool에서만 주로 작업을 하게 되는 개발자는 활용이 어려운 면이 있다.
v$sql_plan은 SQL Cache내 캐싱되어 있는 실제로 수행된 실행계획을 select만으로 간편하게 조회가 가능하므로 SQL 튜닝시 훌륭한 대안이 될 수 있다.
데이터베이스 관리자도 개발자가 접속하는 Database 계정에 관련 뷰 몇 개만 select권한을 부여하면 되므로 보안상으로도 안전하다.
사용자는 상세정보 수집을 위해 SQL 수행 세션에 GATHER_SQL_PLAN_STAT 파라미터를 Y로 설정하고 해당 VIEW를 알맞은 형태로 포맷팅 해주는 DBMS_XPLAN을 통해 조회하면 된다.
alter session set GATHER_SQL_PLAN_STAT=’Y’;
select * from table(dbms_xplan.display_cursor(‘SQL_ID’, ‘OPTION’));
IOSTATS | 수행 정보 중 IO와 관련된 모든 항목을 보여준다(TEMPREAD + TEMPWRITE + BUFGETS) |
MEMSTATS | 수행 정보 중 메모리와 관련된 모든 항목을 보여준다(USEDMEM). |
ALLSTATS | 수행 정보 중 IO, 메모리와 관련된 모든 항목을 보여준다(IOSTATS + MEMSTATS). |
BASIC | 출력 기본 포맷으로 optimizer에서 예측한 cardinality, cost와 마지막 수행에 대한 노드별 수행 시간을 출력한다(CARDS + COST + PART + ELAPTIME + LAST). |
TYPICAL | TYPICAL BASIC 포맷에 추가로 마지막 수행에 대한 노드별 처리 row 수와 predicate 정보, remote sql 정보를 출력한다(BASIC + PE + ROWS + STARTS + PRED + REMOTE + PRECISE) |
ALL | TYPICAL 포맷에 ALLSTATS 항목을 보여준다(TYPICAL + ALLSTATS). |
LAST | 수행 정보 값을 마지막 수행 정보 값만 출력한다. 지정하지 않은 경우 수행 정보 값은 모든 수행에 대한 누적 값을 보여준다. |
PRECISE | CARDS, ROWS에 대해 반올림 없이 실제 값을 보여준다. |
HEADER | 플랜의 기본 정보(sql id, hash value, 총 수행 횟수, 총 패치 횟수, 플랜 수행시간)를 보여준다 |
SQL | 플랜 생성에 사용된 쿼리문을 보여준다. |
@tibero:/tibero/tibero6/scripts # tbsql sys/***** -- 필요 권한 부여 GRANT SELECT ON SYS.V$SQL TO TIBEROTEST; GRANT SELECT ON SYS.V$SQL_PLAN TO TIBEROTEST; GRANT SELECT ON SYS.V$SQL_PLAN_STATISTICS TO TIBEROTEST; @tibero:/tibero/tibero6/scripts # tbsql tiberotest/tibero --보유 권한 확인 SQL> SELECT TABLE_NAME, PRIVILEGE FROM USER_TAB_PRIVS; ---------------------- ------------- TABLE_NAME PRIVILEGE ---------------------- ------------- DBMS_SYSTEM EXECUTE V$SESSION SELECT V$SQL SELECT V$SQL_PLAN SELECT V$SQL_PLAN_STATISTICS SELECT --실행계획 수행 alter session set GATHER_SQL_PLAN_STAT='Y'; select --test01 sum(1) from TIBEROTEST.CODE; (--test01과 같이 임시적으로 id를 부여하면 sql_id를 검색할 때 편리하다)
select sql_id from v$sql where sql_text like '%select --test01%'; ------------------- sql_id ------------------ 3n67fdy080g3f select * from table(dbms_xplan.display_cursor('3n67fdy080g3f', 'ALL')); -- DBMS_XPLAN.DISPLAY_CURSOR은 다음 V$SQL_PLAN 및 -- V$SQL_PLAN_STATISTICS를 다음의 결과와 같이 포맷팅 해주는 함수이다 SELECT * FROM V$SQL_PLAN WHERE SQL_ID = '3n67fdy080g3f'; SELECT * FROM V$SQL_PLAN_STATISTICS WHERE SQL_ID = '3n67fdy080g3f'; ---------결과----------------------- SQL ID : 3n67fdy080g3f HASH VALUE : 2155887726 PLAN HASH VALUE : 748753906 EXECUTIONS : 1 FETCHES : 1 LOADED AT : 2016/04/19 13:18:30 TOT ELAPSED TIME : 00:00:00.0020 AVG ELAPSED TIME : 00:00:00.0020
CARDS | optimizer에서 예측한 해당 플랜 노드의 row 수이다. |
COST | optimizer에서 예측한 해당 플랜 노드의 cost이다. |
PARTITION | 파티션 관련 정보이다. |
PARALLEL | parallel execution 관련 정보이다. |
PREDICATE | 플랜 노드별 predicate 정보이다. |
REMOTE | 플랜 노드별 데이터베이스 링크에 수행한 쿼리 내용이다. |
ROWS | 해당 플랜 노드에서 실제 수행된 row 수이다. |
ELAPSTIME | 해당 플랜 노드에서 실제 수행된 시간이다. |
USEDMEM | 해당 플랜 노드에서 실제 사용된 메모리 양이다. |
TEMPREAD | 해당 플랜 노드에서 실제 사용된 temp read 횟수이다. |
TEMPWRITE | 해당 플랜 노드에서 실제 사용된 temp write 횟수이다. |
BUFGETS | 해당 플랜 노드에서 실제 요청한 buffer get 횟수이다 |
STARTS | 해당 플랜 노드가 실제 재시작된 횟수이다. |
- 강좌 URL : http://www.gurubee.net/lecture/4154
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.