본문 바로가기

카테고리 없음

ORACLE 10g TKPROF v1.0

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 옵션을 주고 결과 파일을 오픈한 모습이다. 수행된 쿼리가 있는 것을

확인할 수 있다. 위 결과는 수행에러(구문,의미에러) 난 쿼리를 제외하고 출력된다.