sqltrace xplan autotrace 설명
https://myjamong.tistory.com/236
실행계획 확인하는방법은 여러가지가있음
오라클이 기본으로 제공하는 쿼리툴 SQL*Plus에서 다음 명령을 수행하면 실행계획이 PLAN_TABLE에 저장된다.
explain plan for
쿼리
PLAN_TABLE에 저장된 정보를 읽어 분석하기 쉬운 형태로 포매팅하는 방법에 여러가지가 있지만, 가장 쉬운 방법은
SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY(null,null,'typical'))
set showplan_text on
쿼리
기본적으로(dbms_xplan.display 함수 세번째 인자에 typical 입력) 확인할 수 있는정보는
Plan Hash Value
오브젝트 액세스방식(Operation)
오브젝트명
예상 Cardinality(=Rows)
예상 데이터 크기(Bytes)
예상 Cost
예상 CPU Time
조건절 정보(Predicate Information) 등이다.
display함수 세번째 인자에 alias, outline, advanced등을 지정하면,
Query Block및 Object Alias, Outline, Column Projection정보를 추가로 확인할 수 있다.
alter session set sql trace = true;
SELECT * FROM 테이블 WHERE 조건;
예상 cardinality / 예상 Cost / 조건절 정보
예상 실행계획 / 실제 disk에서 읽은 블록 수 / 실제기록한 Redo크기
하드파싱 횟수 / 실제 사용한 CPU TIME / 실제 디스크에서 읽은 블록 수
alter session set sql_trace = true
gather_plan_statistics
dbms_xplan.display_cursor(sql_id, child_number, 'allstats last')
SQL트레이스 리포트 파일 생성
트레이스파일명, 결과파일명(확장자 자유), sys=no(SQL파싱과정에서 내부적으로 수행되는 SQL문장을 제외)
tkprof [트레이스 파일명][결과 파일명] sys=no
PARSE COUNT : 하드파싱횟수
CPU : 실제사용한 CPU TIME
DISK : 실제 디스크에서 읽은 블록수
Recursive calls : 하드파싱 과정에서 딕셔너리 조회하거나 DB저장형 함수에 내장된 SQL을 수행할때 발생한 CALL 횟수
dbms_xplan.display_cursor - 첫번째인자 SQL커서 ID, 두번째인자 SQL 커서 CHILD_NUMBER
SQL커서 ID와 CHILD_NUMBER는 SQL문장의 앞쪽 일부 문자열로 V$SQL 뷰의 SQL_TEXT컬럼을 조회해서 얻은 SQL_ID와 CHILD_NUMBER컬럼 값에서 얻는다.
인자를 NULL,NULL입력하면 바로직전 수행한 SQL의 커서 ID와 CHILD_NUMBER를 내부에서 자동 선택해 준다.
SELECT /+ gather_plan_statistics/ count() from table;
SELECT from table (dbms_xplan.display_cursor(null, null, 'allstats last'))
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'))
대기이벤트 발생 예
SGA공유 메모리에서 특정자원을 액세스하려고 래치를 획득하는 과정에서 다른 프로세스와 경합이 발생시
- 디스크로부터 블록 I/O를 요청할때
- 클라이언트로부터 다음 작업 요청이 오기를 기다리는 경우.
1) latch : shared pool
Shared Pool에서 특정 오브젝트 정보 또는 SQL커서를 위한 Free Chunk를 할당받으려 할 때
Shared Pool 래치를 할당받아야한다. 이 대기이벤트는 shared pool래치를 할당받는 과정에서 발생하는 경합과 관련있으며,
하드파싱을 동시에 심하게 일으킬 때 주로 나타난다.
2) library cach lock/library cache pin
SQL수행 도중 DDL을 수행할 때 나타난다.
3) free buffer waits
서버프로세스가 버퍼 캐시에서 FREE BUFFER를 찾지 못해 DBWR에게 공간을 확보해 달라고 신호를 보낸후 대기할 때 나타난다.
4) log file sync
커밋 명령을 받은 서버 프로세스가 LGWR에게 로그버퍼를 로그파일에 기록해 달라고 신호를 보낸 후 대기할 때 나타난다.
대기 이벤트를 기반으로 세션 또는 시스템 전체에 발생하는 병목 현상과 그 원인을 찾아 문제를 해결하는 방법/과정
Response Time = Service Time + Wait Time
= CPU Time + Queue Time