구분 | Oracle AutoTrace | SQL Trace |
---|---|---|
목적 | SQL의 실행 계획과 통계 정보 빠르게 확인 | SQL 실행 시 내부 처리 흐름과 성능 병목 분석 |
사용 대상 | 주로 개발자/튜너가 특정 SQL 분석 시 사용 | 상세한 성능 분석, 트러블슈팅 시 사용 |
접근 방식 | SQL*Plus(오라클에서 제공하는 기본 CLI 도구), TOAD 등의 GUI 툴에서 SET AUTOTRACE ON | 오라클 데이터베이스에 접속 가능한 SQL 클라이언트, DB 내부 세션 또는 프로시저 단에서 ALTER SESSION SET sql_trace = TRUE 등으로 설정 |
결과 위치 | 화면에 직접 출력 | Trace 파일로 저장 (서버 측) |
SET AUTOTRACE ON
은 실행 결과, 실행 계획, 통계 정보를 화면에 보여 주는 명령어.AutoTrace 항목 | SQL Trace 항목 | 내용 |
---|---|---|
consistent gets | query | 일관된 읽기 (논리적 블록 읽기) |
physical reads | disk | 디스크에서 실제로 읽은 블록 수 |
buffer gets | gets | 전체 블록 접근 수 (논리 + 물리 포함) |
rows processed | fetch rows | SQL 실행 시 반환된 총 행(row) 수 |
SQL*Net roundtrips to/from client | fetch call count | 클라이언트와 서버 간 round-trip 횟수 |
recursive calls | recursive calls | 내부적으로 수행된 SQL 호출 수 |
parse calls | parse count | SQL을 파싱한 횟수 |
CPU time | cpu | SQL 실행 시 사용된 CPU 시간 (초) |
elapsed time | elapsed | SQL 실행에 걸린 총 시간 (초) |
executions | execute count | SQL이 실행된 횟수 |
해당 이벤트의 활성화/비활성화는 세션 레벨, 시스템 레벨 등으로 나눌 수 있다.
1) 세션 레벨
SQL> ALTER SESSION SET SQL_TRACE=TRUE;`
-- SYS나 SYSTEM 유저가 아닌 일반 유저로 실행 시 권한 불충분 오류가 발생함으로 alter session 권한을 부여해야 한다.
SQL> grant alter session to 유저명;
2) 시스템 레벨
SQL> ALTER SYSTEM SET SQL_TRACE=TRUE;
-- system 단위로 event 설정 시 모든 SQL이 Trace가 생성됨으로 시스템 부하가 심각하게 발생할 수 있음
-- 그렇기 때문에 system 단위는 특별한 이유가 있을 경우 매우 한시적으로 설정한 뒤 바로 비활성화하여야 한다.
3) 트레이스 레벨 레벨
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
--레벨을 지정하면 SQL_TRACE = TRUE를 해 주지 않아도 활성화됨
4) 트레이스 파일 네이밍 지정
SQL> ALTER SESSION SET TRACEFILE_IDENTIFIER='MYTRACE';
--트레이스 파일의 네이밍은 필수 지정은 아니지만 USER TRACE 파일을 찾기 쉽게 하려면 네이밍을 하는 게 좋다.
-- 다수 유저가 반복적으로 10046을 생성하는 환경이면 내가 수행한 Trace를 찾기 힘들기 때문에 별도의 네이밍을 지정해 Trace 파일을 손쉽게 찾을 수 있게 도와주는 것
--SQL_TRACE=TRUE 로 실행했을 경우
SQL> ALTER SESSION SET SQL_TRACE=FALSE;
--LEVEL 지정 하여 활성화 하였을 경우
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
1) SQL 문장 문법 분석 (Syntax Check)
2) SQL 문장 의미 분석 (Semantic Check)
3) 객체 이름 확인 (Object resolution)
4) 권한 확인 (Privilege Check)
5) 실행 계획 생성 (Optimizer - CBO or RBO)
6) 실행 계획을 공유 풀에 저장
7) 커서(Cursor) 생성
해당 단계는 모두 CPU와 메모리를 많이 쓰며, 동시 사용자 수가 많으면 병목 현상이 발생한다.
이벤트 명 | 설명 |
---|---|
library cache lock | 커서 생성 중 다른 세션이 해당 SQL을 점유하고 있어 대기 |
library cache pin | 커서가 고정된 상태로 다른 세션에서 수정을 못하게 대기 |
cursor: pin S wait on X | 공유 커서를 얻으려다 대기 (경합 발생 시 자주 보임) |
latch: shared pool | 공유 풀에 접근하려는 경합 발생 (메모리 부족 시) |
17 번 문제에서 1 번과 2 번 모두 답인 것처럼 보였지만 1 번의 단계가 직접적인 단계이고, 2 번의 단계는 후속 단계.
latch: shared pool 하드 코딩 과정에서 가장 먼저 발생하는 경합이 래치이다. SQL이 처음 실행되려 할 때 공유 풀에서 커서를 저장할 공간을 찾거나 기존 커서와 비교하려고 할 때 shared pool 접근 권한이 필요하기 때문. 또한 래치는 메모리 보호용 잠금으로, 파싱 중 반드시 거쳐야 하는 단계
library cache lock은 하드 파싱보다는 객체 수준의 공유 문제라고 봐야 한다.
AWR은 주기적으로(기본: 1시간 간격) 다음과 같은 성능 정보를 수집한다.
AWR Report란 두 시점 사이의 성능 스냅샷을 비교 분석한 보고서이다.
-- SQL*Plus 접속 후 실행
@?/rdbms/admin/awrrpt.sql