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
- ROWID에 의한 1 Row Access
- Cluster join 에 의한 1 Row Access
- Unique or Primary Key에 의한 1 Row Access
- Composite key
- Single-Column Indexes
- Indexed column 의 범위 검색
- Indexed column full scan
- 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. 클러스터
- 클러스터 키당평균 블럭수
- 클러스터 키당로우수
- 히스토그램 관련 정보