1. 옵티마이저의 종류

  • CHOOSE : 통계정보의 생성여부에 따라 Cost-Based Approach (ALL_ROWS) 와 Rule-Based Approach 중 선택
  • ALL_ROWS : Cost-Based Approach 사용 (Best Throughput 이 목적)
  • FIRST_ROWS : Cost-Based Approach 사용 (Best Response Time 이 목적)
  • RULE : 미리 정해져 있는 Approach Rule에 의해 Access Path 결정

 

2. 옵티마이저 모드 설정

2-1. 인스턴스 레벨

  • §  Initial Paramemer($ORACLE_HOME/dbs/initSID.ora)에 기술
  • §  OPTIMIZER_MODE = CHOOSE

2-2. 세션 레벨

  • §  ALTER SESSION SET OPTIMIZER_MODE = RULE;
  • §  ALTER SESSION SET OPTIMIZER_GOAL = RULE;

2-3. 구문 레벨

  • §  ORACLE Hint 사용 (/*+ hint */)
  • §  RULE, CHOOSE, FIRST_ROWS, ALL_ROWS

 

3. RBO, CBO

3-1. RBO(Rule Based Optimizer)

3-1-1. RBO란?

  • 미리 정해진 규칙에 의한 실행계획 결정 : 연산자 우선순위, 접근 경로의 우선순위, SQL문의 syntax 규칙
  • 데이터에 대한 통계 내지 실제 SQL을 수행할 경우에 소요될 비용에 대한 고려를 하지 않음 : 인덱스를 쓰려면 내가 찾고자 하는 데이터가 대략 5% 이내라면 써도 되나 꼭 모든 경우에 그런 것은 아니다. 테이블에 총 데이터 건수가 굉장히 많다면 5% 이내라 해도 풀테이블스캔이 더 효율적일 수 있다. 하지만 RBO는 무조건 인덱스가 있으면 인덱스를 타버려 인덱스의 효율이 없음.
  • RBO는 오라클6버전 이하와의 역호환성을 위해 지원

3-1-2. Ranking

  1. ROWID에 의한 1 Row Access
  2. Cluster join 에 의한 1 Row Access
  3. Unique or Primary Key에 의한 1 Row Access
  4. Composite key
  5. Single-Column Indexes
  6. Indexed column 의 범위 검색
  7. Indexed column full scan
  8. Full Table Scan

3-2. CBO

3-2-1. CBO란?

  • 데이터에 대한 각종 통계를 사용
  • 실제 SQL을 수행할 때 소요될 비용을 예측하고 그 값을 기준으로 실행계획 결정 (I/O 횟수, CPU 사용량, 메모리 사용량, 네트워크 전송량)
  • 무조건 정해진 규칙에 의해 판단하는 RBO에 비해 보다 현실적이고 지능적인 판단 가능.
  • 오라클7버전에 처음 도입. 11gR2부터는 RBO는 없어지고 CBO만 쓰임.
 

4. Analyze 내용

4-1. 인덱스

  • 인덱스의 깊이(Depth)
  • 리프(Leaf)블럭수
  • 값당평균 리프블럭
  • 값당평균 데이타블럭
  • 클러스터링팩터
  • 총 로우수
  • Distinct 수
 

4-2. 테이블

  • 총 로우수
  • 데이타블럭수
  • 사용되지 않은 블럭수
  • 블럭당평균 사용가능 공간
  • 체인된 로우수
  • 로우의평균 길이
  • 각 컬럼값의 종류
  • 최대, 최소값
  • 히스토그램 관련 정보  
 

4-3. 클러스터

  • 클러스터 키당평균 블럭수
  • 클러스터 키당로우수
  • 히스토그램 관련 정보