Oracle/Tuning

SQL Trace & tkprof

송지헌 2017. 10. 11. 15:35

SQL Trace

 

* 10046 Trace

level 0   - Trace 하지않음 sql_trace=false 와 동일

level 1   - 일반적인 SQL Trace 정보제공

level 4   - SQL Trace 정보 + Bind 정보제공

level 8   - SQL Trace 정보 + Wait Event 정보제공

level 12 - SQL Trace 정보 + Bind 정보제공 + Wait Event 정보제공

 

* 10046 Trace  순서

alter session set sql_trace = true;

alter session set events '10046 trace name context forever, level [0, 1, 4, 8, 12]';

 

SQL 수행 -> user dump dest에 trc파일 생성

 

alter session set sql_trace = false;

alter session set events '10046 trace name context off';

 

* Trace 파일 이름 지정

alter session set tracefile_identifier='MYTRACE';

 

* tkprof 사용

tkprof tracefile [trace file] sys=no output = [파일명]

 

 

tkprof 통계정보 내용

 

* Parse
  - SQL문이 파싱되는 단계에 대한 통계
  - 새로 파싱을 했거나, 공유 풀에서 찾아 온 것도 포함됨.
  - 단, PL/SQL 내에서 반복 수행(Loop)된 SQL이나 PL*SQL에서 보존 커서(Hold cursor)를 지정한 경우에는 한 번만 파싱됨.

 

* Execute
  - SQL문의 실행단계에 대한 통계임.
  - UPDATE, INSERT, DELETE 문들은 여기에 수행한 결과가 나타나게 됨.
  - 전체범위 방식으로 처리된 결과가 여러 건인 경우는 주로 여기에 많은 값이 나타나며 Fetch에는 아주 적은 값이 나타남.

 

* Fetch
  - SQL문이 실행되면서 Fetch된 통계임.
  - 부분범위 방식으로 처리된 SELECT 문들이나 전체범위 처리를 한 후 한 건을 추출하는 경우
    (AGGREGATE, 전체집계, COUNT 등)는 주로 여리게 많은 값들이 나타나고 EXECUTE에는 아주 적은 값이 나타남.

 

* COUNT
  - SQL문이 파싱된 횟수, 실행된 횟수, FETCH가 수행된 횟수

 

* CPU
  - PARSE, EXECUTE, FETCH가 실제로 사용한 CPU 시간(1/100초 단위)

 

* ELAPSED
  - 작업의 시작에서 종료시까지 실제 소요된 총 시간

 

* DISK
  - 디스크에서 읽혀진 데이타 블록의 수

 

* QUERY
  - 메모리 내에서 변경되지 않은 블록을 읽거나 다른 세션에 의해 변경되었으나 아직 Commit되지 않아 복사해 둔 스냅샷 블록을 읽은 블록의 수
  - SELECT 문에서는 거의가 여기에 해당하며 UPDATE, DELETE, INSERT시에는 소량만 발생됨.

 

* CURRENT
  - 현 세션에서 작업한 내용을 Commit하지 않아 오로지 자신에게만 유효한 블록(Dirty Block)을 액세스한 블록 수
  - 주로 UPDATE, INSERT, DELETE 작업시 많이 발생
  - SELECT문에서는 거의 없으나 아주 적은 양인 경우가 대부분임.

 

* Logical I/O : QUERY + CURRENT

 

* ROWS
  - SQL문을 수행한 결과에 의해 최종적으로 액세스된 ROW의 수
  - 서브쿼리에 의해서 추출된 ROW는 제외됨.
  - 만약 SUM, AVG, MIN, COUNT 등의 그룹함수를 사용한 경우라면 큰 의미가 없음.

[출처] 실행 계획 확인 방법 - SQL Trace & TKPROF 이용 방법 |작성자 themisoo

 

session trace

* dbms_system.set_sql_trace_in_session 프로시저를 사용하는 방법

- 오라클에서 권장하지 않음

SQL> dbms_system.set_sql_trace_in_session(sid => 123, serial# => 12345, sql_trace => true);

 

* dbms_monitor 패키지

- Oracle 10g 부터 사용가능

trace 등록

SQL> begin

dbms_monitor.session_trace_enable(

session_id => 123 ,

serial_num => 12345 ,

waits => true ,

binds => true );

end;

/

OR

SQL> exec dbms_monitor.session_trace_enable(123, 123456, true, true);

 

trace 해제

SQL> begin

dbms_monitor.session_trace_disable (

session_id => 123 ,

serial_num => 123456 );

end;

/

OR

SQL> exec dbms_monitor.session_trace_disable(123, 123456 );