현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

단일 세션 정밀 진단: SQL Trace·TKPROF

SQL Trace를 필요한 범위에만 수집하고 TKPROF의 Call 통계와 Wait를 해석합니다.

예상 읽기 23

핵심 요약

SQL Trace는 특정 Session이나 업무 범위에서 실행된 SQL의 Parse·Execute·Fetch Call, CPU·Elapsed Time, Logical·Physical I/O, 처리 Row 수, Library Cache Miss, Wait와 선택적 Bind 정보를 Raw Trace 파일에 기록합니다. TKPROF는 Trace 파일을 SQL 문장별로 집계하고 정렬해 읽기 쉬운 보고서로 변환합니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
가장 작은 업무 범위 선택
  → Trace 관리 조건 확인
  → Trace 활성화
  → 문제 동작 재현
  → 즉시 비활성화
  → Trace 파일 식별·수집
  → 필요 시 TRCSESS로 병합
  → TKPROF 집계 분석
  → Raw Trace에서 시간 순서·개별 실행·Wait·Bind 재확인

두 도구의 역할은 다음과 같습니다.

도구강점한계
SQL Trace Raw FileCall 순서, 개별 실행, Wait·Bind Context, Commit·Rollback 위치파일이 크고 사람이 직접 읽기 어려움
TKPROFSQL별 총량·평균·Call 통계, Top SQL 선정시간 순서·개별 실행 Context가 약해지고 COMMIT·ROLLBACK 문장을 보고하지 않음
TRCSESS여러 Trace 파일을 Session·Client ID·Service·Module·Action 기준으로 통합분석 보고서를 만들지 않으므로 병합 후 TKPROF 사용
DISPLAY_CURSOR현재 Cursor Cache의 실제 Child Plan과 Runtime Statistics 확인과거 Trace의 Call 순서와 개별 Wait Context는 제공하지 않음

SQL Trace의 핵심 질문은 다음과 같습니다.

  1. Parse·Execute·Fetch 중 어느 Call에 시간이 집중됐는가?
  2. CPU와 Elapsed의 차이를 어떤 Wait들이 구성했는가?
  3. 한 실행·한 Row를 위해 몇 Block을 읽었는가?
  4. 같은 SQL이 한 업무에서 몇 번 호출됐는가?
  5. 빠른 실행과 느린 실행이 같은 집계 안에 섞였는가?
  6. 실제 Trace 당시 Row Source Plan이 기록됐는가?
  7. Connection Pool·RAC 환경에서 Trace가 여러 파일로 분산됐는가?

이 이론의 범위

이 이론은 SQLP의 SQL 고급활용 및 튜닝 → SQL 분석 도구 → SQL 트레이스 범위에서 SQL Trace·TKPROF·TRCSESS를 다룹니다. AWR·ASH·SQL Monitor의 장기·실시간 분석과 10053 Optimizer Trace는 후속 이론에서 다룹니다.


학습 목표

이 이론을 학습한 뒤에는 다음 내용을 설명할 수 있어야 합니다.

  • SQL Trace, TKPROF, TRCSESS의 역할을 구분한다.
  • Parse·Execute·Fetch Call을 SELECT와 DML 기준으로 설명한다.
  • TKPROF의 count, cpu, elapsed, disk, query, current, rows를 해석한다.
  • query + current가 Logical I/O인 이유를 설명한다.
  • elapsed - cpu를 특정 Wait Event 하나와 바로 같다고 보면 안 되는 이유를 설명한다.
  • 현재 Session과 다른 Session의 Trace 수집 방법을 구분한다.
  • Connection Pool에서 Service·Module·Action·Client Identifier가 필요한 이유를 설명한다.
  • plan_statNEVER, FIRST_EXECUTION, ALL_EXECUTIONS를 구분한다.
  • Cursor가 닫히지 않으면 Row Source 통계가 Trace·TKPROF에 나타나지 않을 수 있음을 설명한다.
  • Trace 파일 위치와 식별자를 확인한다.
  • TRCSESS의 Session·Client ID·Service·Module·Action 병합 기준을 설명한다.
  • TKPROF의 SYS, SORT, AGGREGATE, WAITS, EXPLAIN 옵션을 올바르게 해석한다.
  • TKPROF의 EXPLAIN Plan이 Trace 당시 실제 Plan과 다를 수 있음을 설명한다.
  • Bind 값과 Trace 파일의 보안·크기·부하 위험을 통제한다.

1. SQL Trace가 필요한 상황

다음 상황에서는 Instance 전체 누적 통계보다 SQL Trace가 더 직접적인 근거를 제공합니다.

  • 특정 화면·API·Batch만 간헐적으로 느림
  • 한 Session에서 여러 SQL이 순서대로 수행됨
  • Parse·Execute·Fetch 중 지연 위치를 구분해야 함
  • Application이 동일 SQL을 지나치게 반복 호출하는지 확인해야 함
  • Wait Event를 실제 SQL Call과 시간 순서로 연결해야 함
  • Bind 값에 따라 빠른 실행과 느린 실행이 섞임
  • Commit·Rollback·Recursive SQL의 위치가 필요함
  • Connection Pool·Shared Server에서 업무 Trace가 여러 Process로 분산됨

SQL Trace는 상세 정보만큼 부하와 파일 크기도 증가시킵니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
원칙
  → 전체 Database보다 특정 Session·업무
  → 긴 시간보다 재현 가능한 짧은 구간
  → Bind 수집은 기본적으로 비활성화
  → 활성화 명령과 비활성화 명령을 같은 절차에 기록

2. Trace 관리 조건

Oracle 공식 가이드는 SQL Trace 전에 다음 항목을 확인하도록 안내합니다.

항목목적
DIAGNOSTIC_DESTADR Home과 Trace Directory 위치
MAX_DUMP_FILE_SIZETrace 파일의 최대 크기 제한
TIMED_STATISTICSCPU·Elapsed와 여러 시간 통계 수집
STATISTICS_LEVELTYPICAL·ALL이면 일반적으로 TIMED_STATISTICS=TRUE
TRACEFILE_IDENTIFIER생성될 Trace 파일 이름에 식별자 추가
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
ALTER SESSION SET tracefile_identifier = 'ORDER_SEARCH';

Trace를 Instance 전체에 적용하면 Process별 Trace 파일이 대량 생성될 수 있으므로 특별한 목적과 관리 절차가 없는 한 Session·업무 단위를 우선합니다.


3. Parse·Execute·Fetch Call

3.1 SELECT

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Parse
  → 문법·권한·Object 확인
  → Shared Cursor 탐색·필요 시 Optimization

Execute
  → SELECT Cursor 실행 시작
  → 대상 Row를 식별할 준비

Fetch
  → Row Source에서 결과 생산
  → Array 단위로 Client에 반환
  → End-of-Fetch까지 반복

SELECT의 주요 Row 생산과 I/O가 Fetch에 나타나는 경우가 많습니다. 다만 Execute에서도 일부 작업이 발생할 수 있으므로 Plan·Driver·SQL 유형을 함께 봅니다.

3.2 DML

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
INSERT·UPDATE·DELETE·MERGE
  Parse
  → Execute에서 대상 Row 탐색·변경
  → Undo·Redo·Lock 작업
  → 일반적인 SELECT 결과 Fetch 없음

DML의 영향 Row 수는 Execute의 rows에 주로 표시됩니다.

3.3 Fetch Count 주의

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Rows = 1,000
Array Fetch Size = 100
Fetch Call ≈ 10회 이상

실제 Fetch Count는 다음의 영향을 받습니다.

  • Driver Array Fetch Size
  • 마지막 End-of-Fetch Call
  • Client의 일부 Fetch 후 Cursor Close
  • LOB·Nested Cursor와 Driver 구현
  • Parse·Execute·기타 Network Call

Fetch Count와 SQL*Net Round Trip은 관련이 있지만 같은 통계가 아닙니다.


4. 현재 Session Trace

현재 Session은 DBMS_SESSION.SESSION_TRACE_ENABLE을 사용할 수 있습니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
ALTER SESSION SET tracefile_identifier = 'ORDER_SEARCH';

BEGIN
  DBMS_SESSION.SESSION_TRACE_ENABLE(
    waits     => TRUE,
    binds     => FALSE,
    plan_stat => 'FIRST_EXECUTION'
  );
END;
/

-- 문제 동작 재현

BEGIN
  DBMS_SESSION.SESSION_TRACE_DISABLE;
END;
/
옵션의미
waits => TRUEWait 정보를 Trace에 포함
binds => TRUEBind 정보를 Trace에 포함
plan_stat => 'NEVER'Row Source Statistics 기록 안 함
plan_stat => 'FIRST_EXECUTION'첫 실행에서 Row Source Statistics 기록
plan_stat => 'ALL_EXECUTIONS'모든 실행에서 기록하여 파일·부하 증가
plan_stat => NULLFIRST_EXECUTION과 같은 기본 동작

DBMS_SESSION.SESSION_TRACE_DISABLE은 호출한 Session의 Session-level Trace만 해제합니다. Client ID 또는 Service·Module·Action으로 활성화한 Trace는 해당 DBMS_MONITOR Disable Procedure로 해제해야 합니다.


5. 다른 Session Trace

다른 Session을 Trace할 때는 SID와 SERIAL#을 함께 확인합니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT inst_id,
       sid,
       serial#,
       username,
       service_name,
       module,
       action,
       client_identifier,
       sql_id
FROM   gv$session
WHERE  username = :username;
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
BEGIN
  DBMS_MONITOR.SESSION_TRACE_ENABLE(
    session_id => :sid,
    serial_num => :serial_no,
    waits      => TRUE,
    binds      => FALSE,
    plan_stat  => 'FIRST_EXECUTION'
  );
END;
/

BEGIN
  DBMS_MONITOR.SESSION_TRACE_DISABLE(
    session_id => :sid,
    serial_num => :serial_no
  );
END;
/

SESSION_TRACE_ENABLE은 호출자가 연결한 Local Instance의 Session을 대상으로 합니다. RAC에서 대상 Session이 어느 INST_ID에 있는지 확인하고 해당 Instance에서 실행합니다.

serial_num을 생략하면 같은 SID를 가진 Session을 Serial Number와 관계없이 대상으로 삼으므로 운영에서는 SID·SERIAL#을 함께 지정합니다.


6. Connection Pool과 End-to-End Trace

Connection Pool에서는 사용자 요청이 매번 같은 Database Session을 사용하지 않을 수 있습니다. SID 한 개만 Trace하면 다음 문제가 발생합니다.

  • 같은 업무의 일부 요청을 놓침
  • 같은 SID에서 다른 사용자 업무가 섞임
  • 여러 Server Process·Instance에 Trace가 분산됨

Application은 다음 Context를 설정합니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
SERVICE_NAME
MODULE
ACTION
CLIENT_IDENTIFIER

DBMS_APPLICATION_INFO.SET_MODULE, SET_ACTION 또는 Driver API, DBMS_SESSION.SET_IDENTIFIER를 사용할 수 있습니다.

Service·Module·Action Trace 예시는 다음과 같습니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
BEGIN
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
    service_name  => 'ORDER_SVC',
    module_name   => 'ORDER_API',
    action_name   => 'SEARCH',
    waits         => TRUE,
    binds         => FALSE,
    instance_name => NULL,
    plan_stat     => 'FIRST_EXECUTION'
  );
END;
/

BEGIN
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(
    service_name => 'ORDER_SVC',
    module_name  => 'ORDER_API',
    action_name  => 'SEARCH'
  );
END;
/

이 Trace는 기본적으로 Database 전역의 해당 Service·Module·Action 조합에 적용되며, instance_name으로 특정 Instance에 제한할 수 있습니다. 여러 Process가 업무를 처리하므로 여러 Trace 파일이 생성됩니다.


7. TRCSESS로 Trace 파일 병합

TRCSESS는 여러 Trace 파일에서 지정한 기준에 맞는 기록을 하나로 모읍니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
지원 기준
  → session
  → clientid
  → service
  → module
  → action

Session은 SID.SERIAL# 형식으로 지정합니다.

BASH코드 영역 안에서 좌우로 이동할 수 있습니다.
trcsess output=order_search.trc \
  service=ORDER_SVC \
  module=ORDER_API \
  action=SEARCH \
  *.trc

Shared Server, Connection Pool, Service·Module·Action Trace에서는 한 업무의 정보가 여러 Process Trace에 나뉠 수 있으므로 병합 후 TKPROF를 수행합니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
여러 Raw Trace
  → TRCSESS
  → 통합 Raw Trace
  → TKPROF

8. Trace 파일 위치 확인

ADR 환경에서는 V$DIAG_INFO를 사용할 수 있습니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT name,
       value
FROM   v$diag_info
WHERE  name IN ('Diag Trace', 'Default Trace File');
NAME의미
Diag TraceADR Trace Directory
Default Trace File현재 Process의 기본 Trace 파일 경로

Service·Module·Action 또는 Shared Server Trace는 여러 Process에 파일이 생성되므로 Trace Identifier, 문제 시간대, PDB·Instance와 업무 Context를 함께 기록합니다.

Oracle AI Database 26ai에서는 Container별 Trace 파일과 내용을 조회할 수 있는 V$DIAG_TRACE_FILE, V$DIAG_TRACE_FILE_CONTENTS도 제공합니다. 권한과 보안 정책을 따릅니다.


9. 10046 Level

전통적인 Extended SQL Trace Level은 다음과 같이 설명됩니다.

Level수집 정보
1기본 SQL Trace
4기본 통계 + Bind
8기본 통계 + Wait
12기본 통계 + Bind + Wait

내부 Event 구문을 직접 설정하는 방식보다 DBMS_SESSION·DBMS_MONITORwaits, binds, plan_stat 옵션을 우선 사용하면 범위와 해제 절차가 명확합니다.


10. TKPROF 기본 사용

BASH코드 영역 안에서 좌우로 이동할 수 있습니다.
tkprof input.trc output.prf

대표 예시는 다음과 같습니다.

BASH코드 영역 안에서 좌우로 이동할 수 있습니다.
tkprof order_search.trc order_search.prf \
  waits=yes \
  sys=no \
  sort=exeela,fchela,prsela
옵션정확한 의미
`waits=yesno`
sort=...지정한 Resource 기준 내림차순 정렬
print=n정렬된 SQL 중 앞의 n개만 보고서에 출력
aggregate=yes동일 SQL Text의 여러 실행·사용자를 집계하는 기본 동작
aggregate=no동일 SQL Text를 사용한 여러 User의 통계를 합치지 않음
sys=noSYS와 Recursive SQL을 보고서에서 제외
insert=file.sqlTKPROF 통계를 저장할 SQL Script 생성
record=file.sqlNonrecursive SQL을 Replay할 Script로 기록
explain=user/password처리 시점에 EXPLAIN PLAN을 새로 수행
table=schema.tableEXPLAIN PLAN에 사용할 임시 Plan Table 지정

AGGREGATE=NO가 모든 Execute Call을 완전히 개별 실행 단위로 분리해 준다고 단정하지 않습니다. 빠른 실행과 느린 실행의 시간 순서·Bind 차이는 Raw Trace에서 확인합니다.


11. TKPROF Call 통계

항목의미
countParse·Execute·Fetch Call 횟수
cpu해당 Call들의 총 CPU Time(초)
elapsed해당 Call들의 총 Elapsed Time(초)
diskData File에서 물리적으로 읽은 Block 수
queryConsistent Mode Buffer Get
currentCurrent Mode Buffer Get
rows해당 SQL Statement가 처리한 Row 수
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Logical I/O
  = query + current

rows는 SQL Statement의 Subquery 내부에서 처리한 모든 Row까지 포함하는 값이 아닙니다.

SQL 종류Row 수가 주로 표시되는 Call
SELECTFetch
INSERT·UPDATE·DELETE·MERGEExecute

11.1 SELECT 예제

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
call     count      cpu    elapsed       disk      query    current       rows
------- ------  ------- ---------- ---------- ---------- ---------- ----------
Parse        1     0.01       0.02          0         20          0          0
Execute      1     0.00       0.01          0          2          0          0
Fetch       11     0.20       2.50        300      8,000          0      1,000
------- ------  ------- ---------- ---------- ---------- ---------- ----------
total       13     0.21       2.53        300      8,022          0      1,000
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
주요 작업
  → Fetch

Logical I/O
  → 8,022 Blocks

Fetch 비CPU 시간 단서
  → 2.50 - 0.20 = 2.30초

이 2.30초를 특정 Wait Event 하나로 바로 같다고 하지 않습니다. Trace Wait Records에서 I/O·Lock·Commit·Network·Scheduler 등 구성 요소를 확인합니다.

11.2 실행당·행당 계산

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Execute Count = 100
Elapsed       = 50초
Query         = 1,000,000
Rows          = 20,000
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Elapsed / Execution = 0.5초
Query / Execution   = 10,000 Blocks
Query / Row         = 50 Blocks

총량·실행당·행당 지표를 함께 봅니다.


12. Row Source Statistics와 Cursor Close

SQL Trace는 Cursor가 닫힐 때 실제 Row Source Statistics를 Trace에 기록할 수 있습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Cursor Close
  → STAT Record 기록 가능
  → Actual Row Source Plan·Row Count 표시

다음 상황에서는 TKPROF에 Trace 당시 실제 Row Source Plan이 보이지 않을 수 있습니다.

  • Cursor가 아직 열려 있음
  • PL/SQL Cursor Cache에 Child Cursor가 유지됨
  • Trace 종료 전에 Cursor Close가 발생하지 않음
  • plan_stat='NEVER'
  • 필요한 실행이 FIRST_EXECUTION 대상이 아니었음

SQL*Plus는 새 Statement 실행 시 이전 User Cursor를 닫는 경우가 많지만, PL/SQL Cursor 처리에서는 Parent가 닫혀도 Child Cursor가 바로 닫히지 않을 수 있습니다. 필요하면 업무 종료·Session 종료 또는 실제 Cursor Plan을 DISPLAY_CURSOR에서 교차 확인합니다.


13. TKPROF EXPLAIN Plan의 제한

TKPROF EXPLAIN=user/password는 Trace 당시 저장된 실제 Plan을 복원하는 기능이 아닙니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
TKPROF 처리 시점
  → 지정 사용자로 Database 접속
  → EXPLAIN PLAN 새로 수행
  → 현재 통계·Schema·Parameter 기준 예상 Plan 출력

Trace 당시와 다음이 다르면 Plan이 달라질 수 있습니다.

  • Bind 값과 Data Type
  • Optimizer Parameter
  • Object Statistics·Histogram
  • Parsing Schema
  • SQL Profile·Patch·Baseline
  • Adaptive Final Plan
  • Database Version

실제 Trace 당시 Plan은 Trace의 Row Source Statistics가 있으면 이를 우선하고, 현재 Cursor가 남아 있다면 DBMS_XPLAN.DISPLAY_CURSOR로 교차 확인합니다.


14. Recursive SQL과 COMMIT·ROLLBACK

SQL Trace Raw File에는 Commit·Rollback과 Recursive SQL 정보가 기록될 수 있습니다.

그러나 TKPROF는 Trace에 기록된 COMMITROLLBACK Statement를 보고하지 않습니다. Transaction 경계의 정확한 위치가 필요하면 Raw Trace를 확인합니다.

sys=no는 SYS·Recursive SQL을 보고서에서 제외해 User SQL에 집중할 수 있게 하지만 다음 원인을 놓칠 수 있습니다.

  • Hard Parse와 Data Dictionary 접근
  • Dynamic Sampling
  • Space Management
  • Recursive DDL·Internal SQL

Resource 총량을 계산할 때 User SQL과 그로 인해 발생한 Recursive SQL의 비용을 함께 고려할 수 있습니다.


15. Raw Trace가 필요한 경우

  • 같은 SQL의 빠른·느린 실행이 집계 안에 섞임
  • Bind 값별 실행 차이를 확인해야 함
  • SQL Call·Commit·Rollback의 시간 순서가 필요함
  • 특정 Wait가 Parse·Execute·Fetch 중 어디에서 발생했는지 확인
  • Connection Pool 요청이 여러 Trace 파일에 분산됨
  • Cursor가 닫히지 않아 TKPROF Plan이 누락됨
  • TKPROF의 Aggregate 결과가 개별 Outlier를 숨김
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
TKPROF
  → SQL별 총량·평균·우선순위

Raw Trace
  → 개별 실행·시간 순서·Wait·Bind·Transaction Context

16. 보안·운영 위험

위험통제 방법
Trace 파일 급증가장 작은 범위·짧은 시간, MAX_DUMP_FILE_SIZE 확인
CPU·I/O OverheadDatabase 전체 Trace 지양, ALL_EXECUTIONS 신중 사용
Bind 민감정보기본 binds=>FALSE, 승인·암호화·보관 기간 정책
Trace 해제 누락Enable·Disable Script와 담당자·종료 시각 기록
대상 Session 오류INST_ID·SID·SERIAL#·Service·Module·Action 기록
여러 파일 누락TRCSESS, 시간·Identifier·Process 기준 확인
Plan 오해Trace Row Source·DISPLAY_CURSOR와 TKPROF EXPLAIN 구분
Recursive SQL 누락필요 시 sys=yes와 Raw Trace 확인

Bind Trace에는 고객번호, 계좌번호, 주민등록번호, Token 등 민감정보가 포함될 수 있습니다. Trace 파일은 운영 Data와 동일한 보안 수준으로 취급합니다.


17. 실전 분석 순서

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
1. 사용자·Service·Module·Action·시간 범위를 특정한다.
2. 필요한 최소 Trace 범위를 선택한다.
3. waits·binds·plan_stat와 보안·파일 제한을 결정한다.
4. Trace Identifier와 시작 시각을 기록한다.
5. 문제 동작을 재현한다.
6. 즉시 Trace를 해제하고 종료 시각을 기록한다.
7. 여러 파일이면 TRCSESS로 업무 단위 병합한다.
8. TKPROF에서 Total Elapsed·CPU·Disk·Query 기준 Top SQL을 찾는다.
9. Parse·Execute·Fetch 중 집중 Call을 찾는다.
10. 실행당·행당 I/O와 Time을 계산한다.
11. Wait Summary와 Raw Trace의 개별 Event를 연결한다.
12. Row Source Plan이 누락되면 Cursor Close·plan_stat 조건을 확인한다.
13. 빠른·느린 실행이 섞이면 Raw Trace에서 개별 실행·Bind를 비교한다.
14. 변경 후 같은 범위로 재수집해 Response Time과 작업량을 비교한다.

18. 자주 혼동하는 판단

혼동하기 쉬운 판단정확한 기준
SQL Trace는 무조건 Instance 전체로 켠다Session·Client ID·Service·Module·Action 범위를 우선한다
Fetch Count는 Network Round Trip과 같다관련 있지만 Parse·Execute·Driver Call을 포함해 범위가 다르다
elapsed-cpu는 특정 Wait Event 시간이다여러 Wait·Scheduler·Aggregation이 섞일 수 있다
aggregate=no는 모든 실행을 완전히 분리한다User별 동일 SQL 집계를 억제하며 개별 시간 순서는 Raw Trace로 본다
sys=no를 사용해도 전체 Resource는 완전하다Recursive SQL 비용이 제외될 수 있다
TKPROF가 COMMIT·ROLLBACK을 모두 보고한다Raw Trace에는 있어도 TKPROF는 보고하지 않는다
TKPROF EXPLAIN은 Trace 당시 실제 Plan이다TKPROF 처리 시점의 새 예상 Plan이다
Trace를 끄면 Row Source가 항상 즉시 출력된다Cursor Close·plan_stat 조건이 필요할 수 있다
binds=true는 분석에 항상 좋다민감정보와 파일 크기 위험이 크다
Trace 파일 하나가 업무 전체를 담는다Pool·Shared Server·Service Trace는 여러 파일로 분산될 수 있다

스스로 확인하기

개념 확인 문제

문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.

01SQL Trace, TKPROF, TRCSESS의 역할 차이를 설명하시오.
정답 및 해설

SQL Trace·TKPROF·TRCSESS

  • SQL Trace는 Parse·Execute·Fetch, CPU·Elapsed, I/O, Rows, Wait와 선택적 Bind를 Raw Trace에 기록합니다.
  • TKPROF는 Trace를 SQL별로 집계·정렬해 보고서로 만듭니다.
  • TRCSESS는 여러 Trace 파일에서 Session·Client ID·Service·Module·Action 기준 기록을 병합하고, 병합 결과를 TKPROF로 처리합니다.
02SELECT와 DML에서 Parse·Execute·Fetch의 주요 작업 위치를 설명하시오.
정답 및 해설

Call별 작업

  • Parse는 문법·권한·Object와 Shared Cursor를 확인합니다.
  • SELECT Execute는 Cursor 수행을 시작하고, 주요 Row 생산·반환은 Fetch에 나타나는 경우가 많습니다.
  • DML은 대상 Row 탐색·변경·Undo·Redo·Lock이 Execute에 집중됩니다.
03TKPROF의 query, current, disk, rows를 설명하시오.
정답 및 해설

TKPROF I/O·Rows

  • query는 Consistent Mode Buffer Get입니다.
  • current는 Current Mode Buffer Get입니다.
  • query + current가 Logical I/O입니다.
  • disk는 Data File에서 물리적으로 읽은 Block 수입니다.
  • SELECT Row는 Fetch, DML 영향 Row는 Execute에 주로 표시됩니다.
  • Subquery 내부에서 처리한 모든 Row를 포함하는 값은 아닙니다.
04elapsed - cpu를 특정 Wait Event 시간으로 바로 해석하면 안 되는 이유를 설명하시오.
정답 및 해설

Elapsed와 CPU 차이

  • 차이에는 I/O·Lock·Commit·Network·Scheduler 등 여러 Wait가 섞일 수 있습니다.
  • 여러 실행 집계, Parallel Execution과 계측 오차도 영향을 줍니다.
  • Wait가 포함된 Raw Trace에서 Event별 시간과 Call 위치를 확인합니다.
05현재 Session·다른 Session·Service·Module·Action Trace의 Package와 범위를 설명하시오.
정답 및 해설

Trace 범위

  • 현재 Session은 DBMS_SESSION.SESSION_TRACE_ENABLE을 사용합니다.
  • 다른 Session은 DBMS_MONITOR.SESSION_TRACE_ENABLE을 SID·SERIAL#로 사용하며 Local Instance 범위입니다.
  • Connection Pool 업무는 DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE 또는 Client ID Trace를 사용합니다.
  • Service·Module·Action Trace는 여러 Process Trace를 만들 수 있어 TRCSESS 병합이 필요할 수 있습니다.
06planstat의 NEVER, FIRSTEXECUTION, ALLEXECUTIONS를 비교하시오.
정답 및 해설

plan_stat

  • NEVER: Row Source Statistics를 기록하지 않습니다.
  • FIRST_EXECUTION: 첫 실행에서 기록하며 NULL 기본값과 같습니다.
  • ALL_EXECUTIONS: 모든 실행에서 기록하여 파일 크기와 계측 부하가 커질 수 있습니다.
07Cursor Close가 Row Source Statistics와 TKPROF Actual Plan 출력에 미치는 영향을 설명하시오.
정답 및 해설

Cursor Close

  • SQL Trace는 Cursor가 닫힐 때 STAT Row Source 기록을 출력할 수 있습니다.
  • Cursor가 열린 채 유지되거나 PL/SQL Cursor Cache에 남으면 TKPROF에 실제 Row Source Plan이 누락될 수 있습니다.
  • Cursor Close·Session 종료 또는 DISPLAY_CURSOR로 실제 Plan을 확인합니다.
08TKPROF의 aggregate=no, sys=no, explain 옵션의 정확한 의미와 한계를 설명하시오.
정답 및 해설

TKPROF 옵션

  • aggregate=no: 동일 SQL Text를 실행한 여러 User의 통계를 합치지 않습니다. 모든 Execute를 완전히 시간순으로 분리하는 기능은 아닙니다.
  • sys=no: SYS·Recursive SQL을 보고서에서 제외해 User SQL에 집중하지만 Recursive 비용을 놓칠 수 있습니다.
  • explain: TKPROF 처리 시점에 새 EXPLAIN PLAN을 수행하며 Trace 당시 Actual Plan을 복원하지 않습니다.
09TKPROF가 COMMIT·ROLLBACK 문장을 보고하지 않는 점과 Raw Trace가 필요한 상황을 설명하시오.
정답 및 해설

COMMIT·ROLLBACK과 Raw Trace

  • SQL Trace Raw File에는 Transaction 종료 기록이 존재할 수 있지만 TKPROF는 COMMIT·ROLLBACK Statement를 보고하지 않습니다.
  • Transaction 순서, 개별 Wait·Bind, 빠른·느린 실행 분리, Cursor Plan 누락을 확인할 때 Raw Trace를 사용합니다.
10TKPROF에 Executions=50, Elapsed=25초, Query=500,000, Current=10,000, Rows=10,000이 표시됐다. 실행당 Elapsed, 실행당 Logical I/O, 행당 Logical I/O를 계산하시오.
정답 및 해설

계산 - 실행당 Elapsed: 25 ÷ 50 = 0.5초 - 총 Logical I/O: 500,000 + 10,000 = 510,000 Blocks - 실행당 Logical I/O: 510,000 ÷ 50 = 10,200 Blocks - 행당 Logical I/O: 510,000 ÷ 10,000 = 51 Blocks - 총량과 실행당·행당 지표를 함께 사용해 시스템 부하와 단건 비효율을 구분합니다.