아래는 사용자가 SQL문을 입력시 내부적으로 작동하는 원리이다.
Parse : 먼저 옵티마이저는 해당 문장의 문법(오타)등이 없는지 검사하고 Object이름과 권한등을 확인한다.
Transformation : Subquery, InlineView 등의 복잡한 부분을 해석하고 문장을 변환한다.
Optimization : 옵티마이저에게 필요한 기본 정보(통계 등)을 얻고 Access Type과 JoinType을 고려한 비용 계산이 이루어진다.
그리고 최소 비용을 갖는 실행 계획을 도출한다.
도출된 Execuion plan을 통해 쿼리를 실행하고 결과를 리턴한다.
CBO는 비용 기반 옵티마이저 로써 최적의 비용으로 계획을 실행한다
파싱단계에서 SQL커서를 메모리에서 찾아 곧바로 실행하는 것을 소프트 파싱이라고 한다.
찾는데 실패해 최적화 및 Row-Source 생성 단계를 거치는 것을 하드파싱 이라고 한다.
실행 계획과 통계
AutoTrace로 해당 쿼리의 계획, 통계를 확인할 수 있다.
먼저 들여쓰기한 순서대로 작업이 진행되며 현재는 2>1>0 순으로 작업되었다.
Rows는 해당 계획에서 얻은 Row, Bytes는 용량, Cost는 Cpu 사용률을 볼수 있다.
SQL트레이스로 결과와 계획을 분석할 수 있다.
Call : 커서 상태에 따라 Parse, Execute, Fetch의 통계정보를 나타낸다.
count : parse, Execute, Fetch 가 수행된 횟수
cpu : 커서가 각 단계에서 사용한 cpu Time
elapsed : 소요 시간
disk : 디스크로부터 읽은 블록 수
query : Consistent 모드에서 읽은 블록 수
current : Current모드에서 읽은 블록 수
rows : 각 단계에서 읽거나 처리한 건수
위처럼 각 단계에서 소요된 시간 , 용량 등을 쉽게 파악 가능하다.
SQL트레이스는 Row Source Operation도 제공한다.
Rows : 각 수행 단계에서 출력된 로우 수를 의미한다.
cr : Consistent Read
pr : 디스크 블록 읽기
pw : 디스크 블록 쓰기
time : 소요시간
중요한점은 cr Consistent 블록 읽기 에서는 값이 누적된다는 점이다.
PK_EMP 인덱스로 하나의 값을 unique스캔하여 cr이 1이다.
이것으로 테이블에 인덱스하여 하나의 값을 얻으면 cr은 누적되어 2가 된다.
Elapsed time
Elapsed time은 call단위로 측정이 이루어지는 시간 계산법이다.
Elapsed time = Cpu time + Wait time
Elapsed time = Response 시점 - Call 시점
시행시간과 대기시간을 합치거나 혹은 응답시점 - 요청시점으로 계산 시간을 반환한다.