<div class="note"> Beginning Oracle Programming 6장 "오라클의 구문처리" </div>

구문 실행순서#

  1. 파싱
  2. 최적화
  3. 행 소스 생성
  4. 구문실행

파싱#

  1. 구문검사 - 구문이 바른가.? SQL문법에 맞는 형식인가.?
  2. 의미분석 - 구문이 디비 객체들에 비추어 볼때 바른것인가.? 테이블및 칼럼이 존재하는가.?
  3. 공유(SGA) 풀 확인 - 구문이 다른 세션에서 처리된적이 있는가.? 다른 세션에서 처리된 적이 있을 경우 해당 정보를 그대로 다시 사용한다.
동적 수행 뷰인 v$sql 을 통해 각 sql별 해시값을 확인할수 있다.

select sql_text, hash_value, optimizer_mode
from v$sql
where lower(sql_textlike 쿼리문

최적화#

먼저 OPTIMIZER_MODE값에 관련된 설명은 SQL Optimizer 페이지를 참고한다.

CBO를 이용하기 위한 조건

  1. 쿼리에서 참조된 객체에 대한 최소한 하나의 통계가 존재하고, 시스템이나 세션 OPTIMIZER_MODE 파라미터가 RULL이 아닌 다른값으로 지정된 경우
  2. 쿼리가 분할된 테이블이나 인덱스 구성 테이블과 같이 CBO를 필요로 하는 객체에 접근할 경우
  3. CBO 관련 힌트를 사용할 경우
  4. CONNECT BY 쿼리내에 JOIN을 수행하는 것과 같이 CBO에서만 이해할수 있는 SQL구성을 이용할 경우
  5. 다음 형태를 사용할 경우
    • 분할된 테이블
    • 비트맵된 인덱스
    • 인덱스 구성 테이블
    • 규칙에 대한 세부적인 설정
    • 병렬 쿼리 연산
    • 함수 기반 인덱스

autotrace기능을 사용하여 체크해보기 설정은 autotrace설정 페이지를 참고한다.

dbms_stats 패키지를 이용한 통계정보 변경

select * 
from jobs j, job_history h
where h.job_id=j.job_id

plan1.png

begin
  dbms_stats.set_table_stats
  (user, 'JOBS', numrows=>10000000, numblks=>10000000);
  dbms_stats.set_table_stats
  (user, 'JOB_HISTORY', numrows=>10000000, numblks=>10000000);
end;
/

위처럼 통계정보를 수정하면 아래처럼 실행계획이 변경된다.

팁이지만 앞서 통계정보를 변경한뒤 초기화 시켜주기 위해서는 다음처럼 analyze명령어를 사용하면 된다.

analyze table job_history delete statistics;

select * 
from jobs j, job_history h
where h.job_id=j.job_id

plan2.png

다음처럼 rule모드로 변경하면 다시 실행계획이 변경된다.

alter session set optimizer_mode=rule

plan3.png

결과분석

  1. Cost : CBO에서 사용되며 가장 효율이 높은것을 파악하기 위해 사용된다.
  2. Bytes : 현재 단계의 계획으로 생성될 데이터의 바이트 수. 평균 열 크기를 예상되는 열 숫자로 곱한것이다.
  3. Cardinality : 일종의 집중도값이다. 반환되는 레코드의 개수에 대한 예상치라고 볼수도 있다.

행 소스 생성#

구문실행#

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
png
plan1.png 5.8 kB 1 30-Dec-2007 23:00 DongGukLee
png
plan2.png 7.0 kB 1 30-Dec-2007 23:00 DongGukLee
png
plan3.png 3.4 kB 1 30-Dec-2007 23:04 DongGukLee
« This page (revision-14) was last changed on 30-Dec-2007 23:32 by DongGukLee