ORACLE 10g TKPROF
from ORACLE DATABASE 10g PERFORMANCE TUNING TIPS & TECHNIQUES | McGrawHill
1. ORACLE TKPROF
tkprof (input) (output) [sort=parameters] [print=number]
[explain=username/password] [waits=yes|no] [aggregate=yes|no]
[insert=filename] [sys=yes|no] [table=schema.table] [record=filename]
TKPROF 는 RAW TRACE FILE을 가공하는 유틸리티다.
기본적으로 TKPROF (입력) (출력) 형태를 가져야 하며 나머지 옵션은 다음과 같다.
sort=parameters
정렬옵션을 준다.
FCHCPU (CPU time of fetch)
FCHDSK (disk reads for fetch)
FCHCU, FCHQPY (memory reads for fetch)
FCHROW (NUMBER OF ROW FETCHED)
EXEDSK (disk reads during execute)
EXECU,EXEQPY (memory reads during execute)
EXEROW (rows processed during execute)
EXECPU (execute CPU time)
PRSCPU (parse CPU)
PRSCNT (times parsed)
print = number 결과에 출력할 sql 문 수를 결정할 수 있다.
explain = username / password 해당 user 로 EXPLAIN PLAN 을 실행한다.
해당 USER 는 커서를 파싱한 USER 여야 하며 이 과정 중 임시로 plan_table을
생성하기 때문에 create table 권한이 있어야 하며 테이블스페이스에 quota를
보유하고 있어야 한다.
waits = yes/no 대기정보 출력여부를 결정한다.
aggregate = yes/no no 로 설정하면 multiple user에 의해 수행된 동일 sql 을
병합하지 않는다.
insert=filename trace 정보를 저장하는 스크립트를 제작한다.
sys=yes/no default 값은 yes 이다. 이 파라미터는 시스템 내부에서 수행되는
recursive calls 출력여부를 결정한다.
table=schema.table trace 내용을 파일에 내려쓰기 전에 임시로 저장할 테이블지정
record=filename 모든 user의 sql 문을 기록
다음은 explain option을 준 모습이다.
RH3@PROD : /oracle/admin/PROD/udump>$tkprof use_this2.trc result2.trc sys=no explain=scott/tiger
select *
from
copied_dept,copied_emp,dept,emp,salgrade
(통계정보 생략…)
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 13 (SCOTT)
Rows Row Source Operation
------- ---------------------------------------------------
4200 NESTED LOOPS (cr=6109 r=28 w=0 time=54968 us)
1050 NESTED LOOPS (cr=2749 r=27 w=0 time=26922 us)
350 NESTED LOOPS (cr=1489 r=26 w=0 time=18705 us)
70 NESTED LOOPS (cr=159 r=26 w=0 time=14910 us)
5 TABLE ACCESS FULL SALGRADE (cr=19 r=13 w=0 time=12206 us)
70 TABLE ACCESS FULL EMP (cr=140 r=13 w=0 time=2577 us)
350 TABLE ACCESS FULL DEPT (cr=1330 r=0 w=0 time=2846 us)
1050 TABLE ACCESS FULL COPIED_EMP (cr=1260 r=1 w=0 time=5194 us)
4200 TABLE ACCESS FULL COPIED_DEPT (cr=3360 r=1 w=0 time=16802 us)
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
4200 NESTED LOOPS
1050 NESTED LOOPS
350 NESTED LOOPS
70 NESTED LOOPS
5 TABLE ACCESS (FULL) OF 'SALGRADE'
70 TABLE ACCESS (FULL) OF 'EMP'
350 TABLE ACCESS (FULL) OF 'DEPT'
1050 TABLE ACCESS (FULL) OF 'COPIED_EMP'
4200 TABLE ACCESS (FULL) OF 'COPIED_DEPT'
위와같이 PLAN 이 두개 나오게 되며 하단부가 EXPLAIN PLAN 된 실행계획이다.
다음은 sort option을 사용해보았다. sort 옵션으로 하나를 쓰는 경우 아래와 같이 쓰면 되고 다수를 쓸 때는 sort=(parameter1,parameter2, …) 로 사용하면 된다.
다수를 넣은경우 그 의미는 parameter1 + parameter2 + … 값의 정렬을 의미한다.
RH3@PROD : /oracle/admin/PROD/udump>$tkprof use_this2.trc result3.trc sys=no sort=prscpu print=1
실행 후 file 을 open 해 문두를 보면 sort option 을 확인할 수 있다.
TKPROF: Release 9.2.0.4.0 - Production on Thu Jun 25 22:55:57 2009
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Trace file: use_this2.trc
Sort options: prscpu
RH3@PROD : /oracle/admin/PROD/udump>$tkprof use_this2.trc result3.trc sys=no sort=prscpu print=1 insert=ins_q.sql
다음으로 insert option 을 주고 parameter 값으로 사용한 이름을 확인해 보았다.
RH3@PROD : /oracle/admin/PROD/udump>$cat ins_q.sql
REM Edit and/or remove the following CREATE TABLE
REM statement as your needs dictate.
CREATE TABLE tkprof_table
(
date_of_insert DATE
,cursor_num NUMBER
,depth NUMBER
,user_id NUMBER
,parse_cnt NUMBER
,parse_cpu NUMBER
,parse_elap NUMBER
,parse_disk NUMBER
,parse_query NUMBER
,parse_current NUMBER
,parse_miss NUMBER
,exe_count NUMBER
,exe_cpu NUMBER
,exe_elap NUMBER
,exe_disk NUMBER
,exe_query NUMBER
,exe_current NUMBER
,exe_miss NUMBER
,exe_rows NUMBER
,fetch_count NUMBER
,fetch_cpu NUMBER
,fetch_elap NUMBER
,fetch_disk NUMBER
,fetch_query NUMBER
,fetch_current NUMBER
,fetch_rows NUMBER
,ticks NUMBER
,sql_statement LONG
);
INSERT INTO tkprof_table VALUES
(
SYSDATE, 3, 1, 0, 1, 10000, 107, 0, 0, 0, 1
, 1, 0, 188, 0, 0, 0, 0, 0
, 1, 0, 17, 0, 3, 0, 0, 701
, 'select col#,intcol#,reftyp,stabid,expctoid from refcon$ where obj#=:1 order by intcol# asc
');
TKPROF TABLE을 생성하고 정보를 INSERT 하는 것을 볼 수 있다. 값이 하나만
들어가는 이유는 PRINT=1 을 줬기 때문이다.
RH3@PROD : /oracle/admin/PROD/udump>$tkprof use_this2.trc result3.trc sys=no sort=prscpu print=1 insert=ins_q.sql record=rec.trc
RH3@PROD : /oracle/admin/PROD/udump>$vi rec.trc
alter session set events '10046 trace name context forever, level 12' ;
select * from tab ;
select * from copied_dept,copied_emp,dept,emp,salgrade ;
select * from tab ;
select deptno,avg(sal)
from emp
group by deptno ;
select d.dname,e.sal
from emp e, dept d
where e.deptno = d.deptno ;
select dname,avg(sal) from
(select d.dname dname,e.sal sal
from emp e, dept d
where e.deptno = d.deptno)
group by dname ;
alter session set events '10046 trace name context off' ;
위는 record 옵션을 주고 결과 파일을 오픈한 모습이다. 수행된 쿼리가 있는 것을
확인할 수 있다. 위 결과는 수행에러(구문,의미에러) 난 쿼리를 제외하고 출력된다.