optimizer 옵티마이저란 무엇인가?
optimizer 옵티마이저란 무엇인가?
: SQL문을 가장 빠르고 효율적으로 수행하기위해 처리경로를 생성해주는 DBMS의 엔진입니다.
SQL의 최적화 과정은
- 사용자가 수행한 쿼리를 위해 후보군이 될만한 실행계획을 찾는다.
- 오브젝트 통계 및 시스템 통계정보를 이용해 각 실행계획의 예상비용을 산정한다.
- 각 실행계획을 비교해서 최저비용을 갖는 하나를 선택한다.
옵티마이저의 종류로는
규칙기반 옵티마이저와 비용기반 옵티마이저가 있습니다.
규칙기반 옵티마이저의 경우 미리 정해놓은 규칙에 따라 액세스 경로를 찾고 평가하여 실행계획을 선택한다.
여기서 규칙이란 액세스 경로별 우선순위로 인덱스 구조, 연산자, 조건절 형태가 순위를 절정짓는 주 요인이다.
비용기반 옵티마이저는 테이블과 인덱스에 대한 여러 통계정보를 기초로 각 오퍼레이션 단계별 예상비용을 산정하고,
이를 합산한 총 비용이 가장 낮은 실행계획을 선택한다.
여기서 비용이란 쿼리가 실행되는데 발생하는 시간 또는 작업량을 말한다.
옵티마이저 모드 세팅방법
INSTANCE 레벨
DB의 설정파일(initSID.ora 또는 spfileSID.ora)에 전체적으로 적용이 되도록 정의하는 방법으로
옵티마이저 모드는 RULE, CHOOSE, ALL_ROWS, FIRST_ROWS의 종류가 있습니다.
RULE인 경우 규칙기반 접근방식을 사용,
CHOOSE의 경우 한 테이블이라도 Analyzed되어 있는 경우 비용기반 접근방식을 사용합니다.
ALL_ROWS의 경우 비용기반 옵티마이저의 한 방법인데 모든 ROW를 처리한다고 가정하여 비용을 최소화 하는 방법을 실행계획으로 수립,
FIRST_ROWS의 경우 최초의 ROW를 추출하는데 발생하는 비용을 최소화하는 방법을 실행계획으로 수립합니다.
만약 initSID.ora 또는 spfileSID.ora에 아무 내용도 정의되어 있지 않는다면 CHOOSE가 default값으로 적용됩니다.
SESSION 레벨
Alter session 명령을 통해 현재 접속된 세션 레벨에서 옵티마이저 모드를 정의할 수 있습니다.
ex) alter session set optimizer_mode=choose와 같이 정의하면 해당세션이 choose모드로 적용되어집니다.
STATEMENT 레벨
힌트 구문을 사용하여 SQL 문장마다 서로다른 옵티마이저를 적용할 수 있습니다.
ex) select /* + first_rows */
ename, sal, job
from emp