😀저번에 개발 취업 첫 면접을 보러갔을 때 CS질문 중에서 옵티마이저(Optimizer)가 무엇인지 설명해 달라는 질문을 받았다. 이때 나는 옵티티마이저에 대해서 들어본 적도, 알아본 적도 없어서 전혀 모르겠다는 솔찍한 답변을 했었다.
비록 그 회사에서 콜이 오진 않았지만, 그 면접을 내 지식을 늘려가는 기회로 삼아서 더 나은 내가 되도록 옵티마이저에 대한 포스팅을 정리해 보자.
옵티마이저는 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진이다.
개발자가 작성한 SQL을 실행하면 DBMS에서는 옵티마이저를 기반으로 실행계획을 세워서 쿼리를 실행한다.
😀그렇다면 우리는 사용자가 작성한 SQL쿼리가 어떻게 실행되고 어디서 어떻게 옵티마이저가 사용되는지어 우리에게 결과가 돌아오는지 알아볼 필요성이 있다.
쿼리의 실행절차를 크게 나누게 되면 아래의 4단계로 볼 수 있다.
Parsing > Optimization > Generation > Execution
옵티마이저는 최적화 기반을 기준으로 나누는 규칙기반 옵티마이저와, 비용기반 옵티마이저가 있다.
규칙 기반 최적화는 각 테이블이나 인덱스의 통계 정보가 거의 없고 상대적으로 느린 CPU 연산 탓에 비용 계산 과정이 부담스럽다는 이유로 사용되던 최적화 방법이지만, 현재는 대부분의 RDBMS가 비용 기반의 옵티마이저를 채택하고 있다.
RBO는 실행 계획을 결정할 때 미리 정해둔 규칙에 따라 쿼리를 최적화하는 방식이다.
RBO는 쿼리 실행 계획을 만들 때 일반적으로 사용되는 JOIN, WHERE 등의 SQL 구문에 대한 고정 규칙을 적용한다.
일반적으로 규칙을 세워둘 때 실행 속도가 빠른순으로 규칙을 세워두고 우선순위가 높은 방법을 채택하여 실행계획을 세운다.
규칙이란 액세스 경로별 우선순위로서, 인덱스 구조, 연산, 조건절 형태가 순위를 결정짓는 주요인이 된다.
DBMS에서 제공하는 RBO의 경우, 대부분의 경우 규칙의 우선순위를 사용자가 변경할 수 없다. 그러나 일부 DBMS(오라클의 ORSERED hint)에서는 사용자가 규칙의 우선순위를 변경할 수 있는 설정을 제공하기도 한다.
일반적으로 고정된 RBO의 우선순위는 다음과 같다.
우선순위 | 항목 |
---|---|
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는 실행 계획을 선택하기 위해 쿼리를 수행하는데 소요되는 일 량 또는 시간을 기반으로 최적화하는 방식이다.
CBO는 실행 계획을 최대 2천 개까지 세운 뒤 비용이 최소한으로 나온 실행 계획을 수행하게 된다.
이때 실행계획을 수립할 때 판단 기준이 되는 비용은 예상치다. 따라서 CBO는 비용을 예측하기 위해 테이블, 인덱스, 칼럼 등의 다양한 객체 통계정보 및 시스템 통계정보(CPU 속도, 디스크 I/O 속도 등)를 이용한다.
통계정보가 없는 경우 비효율적인 실행계획을 생성할 수 있으므로, 정확한 통계정보를 유지하는 것이 중요하다.
항목 | 규칙 기반 옵티마이저 | 비용 기반 옵티마이저 |
---|---|---|
개념 | 사전에 정의된 규칙 기반 | 최소비용 계산 실행계획 수립 |
기준 | 실행우선 순위(Ranking) | 액세스 비용(Cost) |
인덱스 | 인덱스 존재 시 가장 우선시 사용 | Cost에 의한 결정 |
성능 | 사용자 SQL작성 숙련도 | 옵티마이저 예측 성능 |
장점 | 판단이 매우 규칙적 실행 예상 가능 | 통계 정보를 통한 현실 요소 적용 |
단점 | 예측 통계정보 요소 무시 | 최소 성능 보장 계획의 예측 제어 어려움 |
사례 | AND 중심 양쪽 ‘=’ 시 Index Merge 사용 | AND 중심 양쪽 ‘=’ 시 분포도별 Index 선택 |
통계정보가 옵티마이저에게 미치는 영향력은 절대적이다. CBO의 모든 판단 기준은 통계정보에서 나온다.
주요 통계 정보들에는 다음과 같은 것들이 있다.
구분 | 세부 통계 정보 |
---|---|
테이블 | 테이블의 전체 행의 갯수 테이블이 차지하고 있는 전체 블록 갯수 테이블의 행들이 가지고 있는 평균 길이 |
컬럼 | 컬럼 값의 종류 컬럼 내부 NULL 값의 분포도 컬럼 값의 평균 길이 컬럼 내부 데이터 분포의 추정치 |
인덱스 | LEAF BLOCK 수 : 데이터를 보관하는 블록 수 LEVELS : 인덱스 트리의 LEVEL 정보 CLUSTERING FACTOR : 접근하고자 하는 데이터가 모여 있는 밀집도 |
시스템 통계 정보 | I/O 성능 및 사용률 CPU 성능 및 사용률 |
참고자료(출처)
티스토리 HouseDust 블로그 포스팅 [DB] DB 성능 개선 방법
티스토리 코딩팩토리 블로그 포스팅 [DB] 데이터베이스 옵티마이저(Optimizer)에 대하여
티스토리 코드연구소 블로그 포스팅 [DB] 데이터베이스 옵티마이저(Optimizer)란?
티스토리 hyuuny 블로그 포스팅 [MySQL] 옵티마이저와 힌트 1