TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-14 |
제목 | SQL TRACE FACILITY (TKPROF UTILITY 사용) | ||
---|---|---|---|
SQL TRACE FACILITY (TKPROF UTILITY 사용)
======================================== SQL TRACE FACILITY 는 SQL 문 사용에 대한 성능을 분석하기 위해서 사용된다. 이러한 SQL TRACE FACILITY 를 이용하면 각 SQL 문에 대해서 다음과 같은 정보를 얻을수 있다. . parse, execute, fetch count . CPU 와 elapsed 시간 . physical reads 와 logical reads . 처리된 row 의 수 SQL TRACE FACILITY 는 SESSION 혹은 INSTANCE 단위로 할 수 있고 TRACE 결과 화일은 tkprof UTILITY에 의해 사용자가 읽을 수 있는 형태로 변환시킨다. SQL Trace set up 하여 사용하는방법 1. SQL TRACE enable 및 TRACE 화일 디렉토리 지정 < INSTANCE 단위 > ?/dbs/initSID.ora 화일에 다음 두개의 PARAMETER 를 추가하고 DATABASE 를 다시 STARTUP 시킨다. sql_trace = true timed_statistics = true timed_statistics는 시스템에 많은 LOAD가 걸리므로 사용하지 않는 것이 좋다. < SESSION 단위 > SQL*PLUS timed_statistics = true initSID.ora (V7.3 이상에서는 SQL> ALTER SESSION SET TIMED_STATISTICS = TRUE;) $ sqlplus scott/tiger SQL> ALTER SESSION SET SQL_TRACE = TRUE; SQL> sql문장 실행 SQL> exit SQLFORMS30, RUNFORM30 : -s OPTION 사용 $ runform30 -s frmfile scott/tiger -c vt220 PRO*C EXEC SQL CONNECT :username; EXEC SQL ALTER SESSION SET SQL_TRACE = TRUE; 이렇게 하면 user_dump_dest directory에 trace file이 생성된다. user_dump_dest가 어디로 지정되어 있는지는 다음과 같이 확인한다. sqlplus system/manager SQL>select value from v$parameter where name = 'user_dump_dest'; 2. TRACE 화일 변환 2. 단계에서 SQL 문을 실행하면 user_dump_dest 에 지정된 디렉토리에 TRACE 화일이 생기고 tkprof 를 이용하여 화일을 변환시킨다. TRACE 화일은 쉽게 찾을 수 있는 형태가 아니므로 SQL 문을 실행하기 전에 dump 디렉토리에 있는 ora_xxxx.trc 화일을 모두 삭제하거나 가장 최근에 생긴 화일 중에서 찾아야 한다. (이 때 해당 user에 plan_table 이라는 table이 없으면 @$ORACLE_HOME/rdbms/admin/utlxplan.sql 을 수행하여 table을 만든다) 예. $ cd $ORACLE_HOME/rdbms/log $ tkprof ora_1111 out sort=fchqry,fchcu explain=scott/tiger print=20 ora_1111 : TRACE 화일 out : OUTPUT 화일. 디렉토리에 out.prf 로 생긴다. sort : 지정된 OPION(fchqry,fchcu) 에 ASCENDING 순으로 SQL 문을 SORTING 한다. explain : SQL 문의 EXECUTION PLAN 을 발생시킨다. print : 지정된 갯수의 SQL문에대해서만 TRACE 결과를 PRINT 한다. 3. SQL TRACE 결과 분석 ********************************************************************** count = number of times OCI procedure was executed cpu = cpu time in seconds executing elapsed = elapsed time in seconds executing disk = number of physical reads of buffers from disk query = number of buffers gotten for consistent read current = number of buffers gotten in current mode (usually forupdate) rows = number of rows processed by the fetch or execute call ********************************************************************** SELECT COUNT(*) FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO call count cpu elapsed disk query current rows ----------------------------------------------------------------- Parse 2 0.00 0.00 0 0 0 0 Execute 2 0.00 0.00 0 0 0 0 Fetch 2 0.00 0.00 0 33 2 1 Misses in library cache during parse: 1 Parsing user id: 8 (SCOTT) Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT 0 SORT (AGGREGATE) 16 NESTED LOOPS 16 TABLE ACCESS (FULL) OF 'EMP' 16 INDEX (UNIQUE SCAN) OF 'DEPT_PRIMARY_KEY' (UNIQUE) ********************************************************************* 분석 예) a. CPU, elapsed 정보가 없는 경우는 initSID.ora 에 Timed_statistics = false로 되어 있기 때문이다. b. Execute count와 Fetch count가 동일하게 크다고 하면 ARRAY FETCH 사용을 고려함. c. fetch된 rows 수 : query + current = 1 : 4 이하이면 SQL 문은 적절히 사용된 경우이고, row 수에 비하여 query + count가 상당히 크면 부적절하게 사용된 SQL 문이므로(count, sum, distinct 등 Group function을 사용하는 경우는 예외) 다음 내용들에 대해서 재검토가 필요하다. .INDEX 사용, 구성 여부 .ROWID 사용 .COST_BASED OPTIMIZER 사용(ORACLE 7) .ARRAY FETCH 사용 .SORTING을 피할 수 있는 SQL 문 구사 d. Parse count, Execute count가 비슷한 경우 RELEASE_CURSOR, HOLE_CURSOR OPTION 사용하여 Parse count를 줄임. |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |