실행계획을 확인하는 법
오라클이 기본으로 제공하는 쿼리툴 SQL *PLUS에서
explain plan for
SELECT ....
PLAN_TABLE에서 저장된 정보를 읽어 분석하기 쉬운 형태로 포매팅하는 방법
dbms_xplan.display
SELECT * FROM table ( dbms_xplan.display (null, null, 'typical') );
SQL Server에서 예상 실행계획을 출력하는법
set showplan_text on
오라클 예상 실행계획에서 기본으로 (dbms_xplan.display 함수 세번째 인자에 'typical' 입력) 확인할 수 있는 정보는 Plan Hash Value, 오브젝트 액세스 방식(Operation), 오브젝트명, 예상 Cardinality(Rows), 예상 데이터 크기(Bytes), 예상 Cost, 에상 CPU Time, 조건절 정보 (Predicate Information)
dbms_xplan.display 세번째 인자에 alia, outline, advanced 등을 지정하면, Query Block 및 Object Alias 정보, Outline 정보, Column Projection 정보 등을 추가로 확인할 수 있음.
오라클 AutoTrace에서 확인할 수 있는 정보
- 예상 실행 계획
- 실제 디스크에서 읽은 블록수
- 실제 기록한 Redo 크기
AutoTrace
- set autotrace on : SQL을 실행하고 결과집합과 함께 예상 실행계획 및 실행통계를 출력
- set autotrace on explain : SQL을 실행하고 결과집합과 함께 예상 실행계획을 출력
- set autotrace on statistics : SQL을 실행하고 결과집합과 함께 실행통계를 출력
- set autotrace traceonly : SQL을 실행하지만 결과는 출력하지 않고, 예상 실행계획과 실행통계만 출력
- set autotrace traceonly explain : SQL을 실제로 실행하지않고, 예상 실행 계획만 출력
- set autotrace traceonly statistics : SQL을 실행하지만 결과는 출력하지않고 실행통계만 출력
statistics_level 파라미터를 all로 설정하면, SQL 트레이스가 메모리에 수집된다.
gather_plan_statistics는 파라미터가 아니라 옵티마이저 힌트다. -> SQL 트레이스 정보를 서버 파일이 아닌 SGA메모리에 기록한다.
V$SQL_PLAN)STATISTICS_ALL 뷰에서 직접 조회할 수 있지만. dbms_xplan.display_cursor 함수를 이용하면 분석하기 쉬운 포매팅
dbms_xplan.display_cursor 첫번째와 두번째 인자에는 SQL커서의 ID와 Child_NUMBER입력
TKProf 유틸리티를 사용하면 SQL 트레이스 파일을 분석해서 리포트 파일을 생성해 준ek
- tkprok ora10g_ora_14370_oraking.trc report.prf sys=no
트레이스 파일명, 결과 파일명 (확장자는 자유), SQL을 파싱하는 과정에서 내부적으로 수행되는 SQL문장을 제외
AutoTrace의 'recursive calls'는 하드파싱 과정에서 딕셔너리를 조회하거나 DB저장형 함수에 내장된 SQL을 수행할때 발생한 Call 횟수를 표시
monitor 힌트는 실시간 SQL 모니터링을 위해 사용하는 힌트. 리포트는 dbms_sqltune.report_sql_moniter 함수로 출력
DBMS_XPLAN.DISPLAY_CURESOR 정보
- Starts : 각 오퍼레이션 단계별 실행 횟수
- E-Rows : 옵티마이저가 예상한 Rows
- A-Rows : 각 오퍼레이션 단계에서 읽거나 갱신한 로우수 (rows)
- A-Times : 각 오퍼레이션 단계별 소요시간 (time)
- Buffers : 캐시에서 읽은 버퍼 블록 수 (cr(query), current)
- Reads : 디스크에서 읽은 블록수 (pr)
SQL 트레이스 확인하는 옵션
set statistics profile on : 각 쿼리가 일반 결과집합을 반환하고 그 뒤에는 쿼리 실행 프로필을 보여 주는 추가 결과집합을 반환한다. 출력에는 다양한 연산자에서 처리한 행수 및 연산자의 실행 횟수에 대한 정보도 포함
set statistics io on : Transact-SQL 문이 실행되고 나서 해당 문에서 만들어진 디스크 동작 양에 대한 정보 표시
set statistics time on : 각 Transact-SQL 문을 구문 분석, 컴파일 및 실행하는 데 사용한 시간을 밀리초 단위로 표시
프로세스가 공유 메모리의 버퍼캐시, 라이브러리 캐시에서 정보를 읽으려면 래치를 반드시 획득해야한다. 래치를 획득하는 과정에 경합이 발생하면 대기 이벤트가 나타나지만, 경합없이 바로 읽으면 대기 이벤트가 나타나지 않는다.
대기 이벤트는 프로세스가 CPU를 OS에 반환하고 수면(Sleep) 상태로 진입하는 원인을 기록하기 위해 개발
1. 프로세스가 필요로 하는 특정 리소스가 다른 프로세스에 의해 사용중일때
2. 다른 프로세스에게 작업을 요청하고 해당 작업이 완료되기를 기다릴때
3. 프로세스가 할일이 없을때
대기 이벤트 발생
대기 이벤트가 나타나는 대표적인 예 . SGA 공유 메모리에서 특정 자원을 액세스하려고 래치를 획득하는 과정에 다른 프로세스 경합이 발생하거나, 디스크로부터 블록 I/O을 요청하거나, 클라이언트로부터 다음 작업 요청이 오기를 기다리는 경우
Shared Pool에서 특정 오브젝트 정보 또는 SQL 커서를 위한 Free Chunk를 할당받으려 할때 shared pool 래치를 할당받아야한다. latch: shared pool 대기 이벤트는 shared pool 래치를 할당받는 과정에 발생하는 경합과 관련 있으며, 하드 파싱을 동시에 심하게 일으킬때 나타난다.
library cache lock과 library cache pin 대기이벤트는 주로 SQL 수행도중 DDL을 수행할때 발생
free buffer waits 대기 이벤트는 서버 프로세스가 버퍼 캐시에서 Free Buffer를 찾지 못해 DBWR에게 공간을 확보해 달라고 신호를 보낸후 대기할때 발생
log file sync 대기 이벤트는 커밋 명령을 전송받은 서버 프로세스가 LGWR에게 로그 버퍼를 고르 파일에 기록해 달라고 신호를 보낸 후 대기할때 나타난다.
대기 이벤트를 기반으로 세션 또는 시스템 전체에 발생하는 병목 현상과 그 원인을 찾아 문제를 해결하는 방법,과정을 대기 이벤트 기반 또는 응답 시간 분석 성능관리 방법론 이라고 한다.
OWI(Oracle Wait Interface)는 Response Time Analysis 방법론을 지원하려고 오라클이 제공하는 기능과 인터페이스를 통칭
AWR(Automatic Workload Repository)는 성능 관련 데이터를 주기적으로 수집함으로써 Ratio 기반 분석과 대기 이벤트 기반 분석을 모두 지원하는 오라클 성능 관리 표준도구
Response Time = Servie Time + Wait Time, = CPU Time + Queue Time
Service Time(Cpu Time)은 프로세스가 정상적으로 동작하며 일을 수행한 시간
Wait Time (Queue Time)은 Cpu를 OS에 반환하고 수면상태에서 대기한 시간
오라클은 전통적으로 사용하던 Ratio 기반 성능 분석 방법론에 응답 시간 분석 방법론을 더해 Statspack을 개발하였고 이를 확장 및 업드레이드한 것이 AWR이다
AWR 보고서를 활용해 성능 이슈를 해결하려면 peak 시간대 또는 장애 발생 시점을 전부해 가능한 짧은 스냅샷 구간을 선택해야한다.
sar, topas, vmstat, osstat등 os 모니터링 도구를 이용해 CPU, 메모리, I/O 사용량 정보를 수집하고 이를 통해 peak 시간대를 파악
dba_hist_로 시작하는 각종 뷰를 이용해 사용자가 직접 AWR 보고서에 출력되는 항목 볼수 있음
보고서 요약에는
- 캐시 크기, 부하 프로파일, 인스턴스 효율성, 최상위 대기 이벤트, Shared Pool 통계, IO 프로파일, 메모리통계 포함 (SQL 통계는 포함되지않지만 보고서를 활용하는 주요 내용중 하나)
Soft Parse % : 실행계획이 라이브러리 캐시에서 찾아져 하드파싱을 일으키지 않고 SQL을 수행한 비율
(전체 Parse Call 횟수 - 하드파싱 횟수) / (전체 Parse Call 횟수) * 100
Execute to Parse % : Parse Call 없이 곧바로 SQL을 수행한 비율, 즉 커서를 애플리케이션에서 캐싱한 채 반복 수행한 비율
Parse CPU to Parse Elapsd % : 파싱 총 소요 시간 중 CPU TIME이 차지한 비율, 파싱에 소요된 시간 중 실제 일을 수행한 시간 비율, 이 값이 낮다면 파싱 도중 대기가 많이 발생함
오라클 10g부터 시스템에 문제가 생겼을때 ASH 도입 (Active Session History)
v$active_session_history 뷰를 통해 세션 히스토리 정보확인하고 과거 시점에 발생한 장애 및 성능 저하 원인까지 세션 레벨로 분석가능
AWR로 옮겨진 더 오래된 과거의 세션 히스토리는 dba_hist_active_sess_history에서 확인
Rat는 DB 구조 변경, 버전 업그레이드, 솔루션 도입, OS/하드웨어/스토리지 변경이 시스템에 미치는 영향을 사전에 파악하고 평가할 수 있게 도와줌
SPA는 데이터베이스 변경 작업이 구체적으로 SQL 실행계획에 어떤 영향을 미치는지 분석할 수 있게 도와주는 기능으로 오라클 RAT 옵션중 하나
v$session_wait 뷰를 통해 문제의 대기 이벤트를 가장 많이 발생시키는 세션 목록 확인
v$active_session_history 뷰를 통해 문제의 세션들이 어떤 SQL을 수행하고 있는 확인
v$sql 뷰를 통해 문제 SQL의 전체 문장과 수행 통계 (실행횟수, 평균 소요시간, 평균 블록 I/O)확인