쿼리문이 비정상적으로 오래걸려서 왜이리 쿼리가 오래 걸리는지 파악 하는 와중에 팀장님이 실행계획을 보라고 말씀해주셨고 옵티마이저로 실행계획을 확인했다. 확인 결과 join을 하는 view에 index가 존재하지 않음을 확인 할 수 있었다. 그래서 index와 옵티마이저를 정리할 건데 일단 옵티마이저 부터 정리해보자!
옵티마이저는 SQL을 가장 빠르고 효울적으로 수행할 최적의 처리경로를 생성해주는 DBMS의 핵심엔진이다.
인간은 생각하기 위해 두뇌를 가지고 있고 컴퓨터는 cpu를 가지고 있으며 dbms는 옵티마이저를 가지고 있다!
가장 효율적인 방법을 찾는 일을 하는 것이 옵티마이저의 역활이다.
그럼 효율적인 방법을 옵티마이저는 어떻게 찾을까?
크게 두 가지 방법으로 찾는데 규칙기반, 비용기반 최적화이다.
| 항목 | 규칙 기반 옵티마이저 | 비용 기반 옵티마이저 |
|---|---|---|
| 개념 | 사전에 정의된 규칙 기반 | 최소비용 계산 실행계획 수립 |
| 기준 | 실행우선 순위(Ranking) | 액세스 비용(Cost) |
| 인덱스 | 인덱스 존재 시 가장 우선시 사용 | Cost에 의한 결정 |
| 성능 | 사용자 SQL작성 숙련도 | 옵티마이저 예측 성능 |
| 장점 | 판단이 매우 규칙적 실행 예상 가능 | 통계 정보를 통한 현실 요소 적용 |
| 단점 | 예측 통계정보 요소 무시 | 최소 성능 보장 계획의 예측 제어 어려움 |
| 사례 | AND 중심 양쪽 ‘=’ 시 Index Merge 사용 | AND 중심 양쪽 ‘=’ 시 분포도별 Index 선택 |
RBO는 실행계획을 결정할 때 미리 결정해 놓은 계획대로 실행하는 방법이다.
RBO의 정의를 읽어보면 옵티마이저는 미리 결정해 놓은 계획이 있는 거 같다. RBO는 어떤 계획들을 가지고 어떤 우선순위를 가지고 있을까?
RBO는 실행 속도가 빠른순으로 규칙을 세워두고 우선 순위가 높은 방법을 채택하는 옵티마이저이다. 우선 순위는 15가지이고 아래와 같다.
| 순위 | 설명 |
|---|---|
| 1 | ROWID를 사용한 단일 행인 경우 |
| 2 | 클러스터 조인에 의한 단일 행인 경우 |
| 3 | 유일하거나 기본키(Primary Key)를 가진 해시 클러스터 키에 의한 단일 행인 경우 |
| 4 | 유일하거나 기본키(Primary Key)에 의한 단일 행인 경우 |
| 5 | 클러스터 조인인 경우 |
| 6 | 해시 클러스터 조인인 경우 |
| 7 | 인덱스 클러스터 키인 경우 |
| 8 | 복합 칼럼 인덱스인 경우 |
| 9 | 단일 칼럼 인덱스인 경우 |
| 10 | 인덱스가 구성된 칼럼에서 제한된 범위를 검색하는 경우 |
| 11 | 인덱스가 구성된 칼럼에서 무제한 범위를 검색하는 경우 |
| 12 | 정렬-병합(Sort-Merge) 조인인 경우 |
| 13 | 인덱스가 구성된 칼럼에서 MAX 혹은 MIN을 구하는 경우 |
| 14 | 인덱스가 구성된 칼럼에서 ORDER BY를 실행하는 경우 |
| 15 | 전체 테이블을 스캔(FULL TABLE SCAN)하는 경우 |
CBO는 쿼리를 수행하는 양 또는 시간을 기반으로 최적화하는 방식이다.
비용기반 옵티마이저에는 여러 모드가 존재합니다. 모드에 따라서 비용을 구하는 방식들이 달라집니다.

주요 통계 정보
| 구분 | 세부 통계 정보 |
| 테이블 | 테이블의 전체 행의 갯수 |
| 테이블이 차지하고 있는 전체 블록 갯수 | |
| 테이블의 행들이 가지고 있는 평균 길이 | |
| 컬럼 | 컬럼 값의 종류 |
| 컬럼 내부 NULL 값의 분포도 | |
| 컬럼 값의 평균 길이 | |
| 컬럼 내부 데이터 분포의 추정치 | |
| index | LEAF BLOCK 수 : 데이터를 보관하는 블록 수 |
| LEVELS : 인덱스 트리의 LEVEL 정보 | |
| CLUSTERING FACTOR : 접근하고자 하는 데이터가 모여 있는 밀집도 | |
| 시스템통계 정보 | I/O 성능 및 사용률 |
| CPU 성능 및 사용률 |