본문 바로가기
Database

DBMS의 핵심? 옵티마이저

by rkdxodid 2024. 11. 6.

옵티마이저(optimizer)란?

옵티마이저는 가장 빠르고 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진이다.

엥? 그게 뭔데?

DBMS에는 개발자가 작성한 SQL을 어떻게 실행할 것인지실행 계획(Execution Plan)을 수립하고 SQL을 실행하게 되는데, 바로 이 실행 계획을 수립을 옵티마이저가 하게 됩니다.

개발자가 작성한 SQL을 실행하면 DBMS에서는 옵티마이저를 기반으로 실행계획을 세워서 쿼리를 실행한다.

 

쿼리 처리 흐름

 

  1. 개발자가 SQL문을 작성하면
  2. Parser에서 개발자가 작성한 SQL문을 문법 검사와 구문 분석을 합니다.
  3. 옵티마이저는 아래서 설명할 두 방법의 플랜을 생성하고, 카탈로그 매니저에 있는 각종 통계정보를 기반으로 비용을 평가하여 최소 비용의 실행 계획을 결정합니다
  4. SQL 실행 엔진이 옵티마이저가 결정한 실행계획대로 데이터를 처리하여 사용자에게 전달합니다.

(중요)

대부분의 관계형 데이터베이스는(RDBMS) 비용기반 옵티마이저만을 제공합니다.

먼저, 실행 계획이 무엇인지 부터 알고 가도록 하자.

 

실행 계획(Execution Plan)이란?

쿼리 실행을 최적화하기 위해 데이터베이스가 채택하는 전략과 방법을 나타낸 “계획표” 라고 볼 수 있다.

  • 실행 계획에는 이러한 정보들이 포함된다.
  1. 연산 순서 : 테이블 접근**,** 조인, 필터링, 정렬 등의 순서
  2. 접근 방법 : 인덱스나 풀 테이블 스캔을 통해 특정 레코드를 빠르게 찾는 방법
  3. 조인 방법 : 해시 조인, 중첩 루프 조인 등의 다양한 방식 중 선택
  4. 필터 및 조건 처리 : 쿼리의 where 조건이나 필터 조건을 처리

 

규칙기반 옵티마이저 (RBO, Rule Based Optimizer)

규칙 기반 옵티마이저는 **규칙(우선순위)**을 가지고 실행계획을 생성합니다.

규칙기반 옵티마이저는 우선 순위 규칙이 정해져 있고, 우선 순위를 기반으로 우선 순위가 높은 규칙에 해당하는 실행계획을 생성합니다.

다음 사진의 순위의 숫자가 낮을수록 높은 우선 순위이다.

순위 설명

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, Cost Based Optimizer)

비용기반 옵티마이저는 SQL문을 처리하는데 필요한 비용이 가장 적은 실행계획을 선택하는 방식이다.

여기서 비용이란 SQL문을 처리하기 위해예상되는 소요시간 또는자원 사용량을 의미한다.

비용기반 옵티마이저는 비용을 예측하기 위해서 규칙기반 옵티마이저가 사용하지 않는 테이블, 인덱스, 칼럼 등의 다양한 객체 통계정보와 시스템 통계정보 등을 이용한다.

통계정보가 없는 경우 비용기반 옵티마이저는 정확한 비용 예측이 불가능해져서 비효율적인 실행계획을 생성할 수 있기에 정확한 통계 정보가 최적화에 중요하다.

 

비용 기반 옵티마이저의 구성

비용 기반 옵티마이저는 질의 변환기, 대안 계획 생성기, 비용 예측기로 이루어져 있다.

 

질의 변환기

사용자가 작성한 SQL문을 처리하기 편한 형태로 변환하는 모듈

 

대안 계획 생성기

동일한 결과를 생성하는 다양한 대안 계획을 생성하는 모듈.

연산의 적용 순서, 연산 방법, 조인 순서 변경 등을 통해서 생성된다.

그러나 대안 계획의 생성이 너무 많아지면 최적화를 수행하는 시간이 그만큼 오래 걸린 수 있다.

그래서 대부분의 상용 옵티마이저들은 대안 계획의 수를 제약하는 다양한 방법을 사용한다

 

비용 예측기

대안 계획 생성기에 의해서 생성된 대안 계획의 비용을 예측하는 모듈이다.

정확안 비용을 예측하려면 정확한 통계 정보를 필요로 한다.

비용기반 옵티마이저는 통계정보, DBMS 버전, DBMS 설정 정보 등의 차이로 인해 동일 SQL문도 서로 다른 실행계획이 생성될 수 있다

 

옵티마이저의 한계

옵티마이저도 결국 사람이 만든 소트프웨어 엔진에 불과하니 옵티마이저를 과신 하지 말자. 옵티마이저가 비효율적으로 동작하고 있다면 오라클의 힌트와 같은 부가적인 장치로 올바르게 작동하도록 유도해야 한다.

그러니 쿼리 튜닝을 할 떄에는 쿼리문의 실행계획을 꼭 보자

 

참고

https://coding-factory.tistory.com/743

https://zangzangs.tistory.com/103

https://code-lab1.tistory.com/137