✨ 옵티마이저?
옵티마이저(Optimizer)는 사용자가 작성한 SQL 문에 대해 최적의 실행 방법을 결정하는 역할을 수행한다.
이러한 것을 실행 계획(Execution Plan) 이라고 한다. 관계형 데이터베이스는 Java, C등과 같은 프로그램 언어와 다르게 사용자의 요구사항만 기술하고 처리 과정에 대해서는 기술하지 않는데, 그렇기 때문에 옵티마이저에서는 다양한 실행 방법 중 최적의 실행 방법을 결정하는 것이다. 그러므로 옵티마이저가 선택한 실행 방법이 수행 속도에 가장 큰 영향을 끼치게 된다.
그러나 이런 결정을 정할 때, 옵티마이저는 실제로 처리해보지 않은 상태에서 정해야 한다는 어려움이 존재한다.
옵티마이저가 최적의 실행 방법을 결정하는 방식은 규칙기반의 옵티마이저(RBO, Rule Based Optimizer)와 비용 기반 옵티마이저(CBO, Cost Based Optimizer) 로 구분할 수 있는데, 현재 대부분의 관계형 데이터베이스는 CBO만 제공한다.
🪡 규칙 기반 옵티마이저(RBO)
규칙 기반 옵티마이저는 우선 순위를 기반으로 실행계획을 생성한다. 그렇기 때문에 규칙을 이해하고 있다면 누구나 쉽게 실행 계획을 예측할 수 있다.
실행 계획을 생성할 때 참조하는 정보에는 인덱스 유무와 연산자, 참조 객체 종류 등이 있으며 이러한 정보에 따라 우선 순위가 정해져 있고, 이 우선 순위를 기반으로 실행 계획을 생성한다. 결과적으로 보자면, 이 규칙 기반 옵티마이저는 우선 순위가 높은 규칙대로 순차적 실행을 한다고 볼 수 있다.
🧶 비용 기반 옵티마이저(CBO)
규칙 기반의 옵티마이저에서는 조건절에서 '=' 연산자와 'BETWEEN' 연산자가 사용될 경우, 규칙에 따라서 '=' 를 우선 순위로 지정한다. 그러나, 실제로는 'BETWEEN' 칼럼의 인덱스를 사용하는 것이 절약될 수 있다. 이와 같이 현실의 많은 경우의 수를 규칙으로 예측하기란 쉽지 않기 때문에, 그것을 극복하고자 나온 것이 CBO이다.
비용 기반 옵티마이저는 비용을 예측하기 위해 규칙기반 옵티마이저에서는 사용하지 않던 테이블, 인덱스, 칼럼 등의 다양한 객체 통계 정보와 시스템 통계 정보 들을 이용한다. 이와 같은 정보들을 가지고 있기 때문에 비용 예측을 할 수 있는 것이기에 정확하고 유의미한 통계 정보를 유지하는 것이 최적화의 중요 요소라고 볼 수 있다.
🏹 실행 계획(Execution Plan)
실행 계획은 SQL에서 요구한 사항들을 처리하기 위한 절차와 방법을 뜻한다. 그러므로, 실행 계획을 생성한다는 것은 SQL을 어떤 순서로 실행할 지 결정하는 작업이라고 볼 수 있다. 다양한 처리 방법이 존재하고, 각 처리 방법마다 당연히 그 비용은 다를 수 있다.
옵티마이저는 다양한 실행 방법 중에서 가장 효율적인 방법을 찾아서 생성하며, 생성된 실행 계획을 보는 방법은 데이터베이스마다 상이하나 처리를 위한 절차와 방법을 의미한다는 기본 사항은 모두 같다.
✨ 추가
조금 어려울 수 있는데, 아주 간단하게 생각하는 법이 있다!자바에서 배열을 비교한다고 생각해보자. (내 주 언어이기 때문에) 여기에서 두 배열을 처리한다 생각할 때, 개발자는 어느 것이 더 실행 시간이 빠를지 고민하게 된다. 예를 들어 1, 2, 3, 4, 5가 들어있는 배열과 4, 2, 1이 들어있는 배열이 있다고 생각할 때 개발자는1. 두 배열을 모두 오름차순 정렬한 뒤 비교하기2. 배열들을 그대로 두고 들어있는 수가 많은 배열을 선순위로 하고 큰 배열을 후순위로 해서 비교하기3. 두 배열을 map으로 변경해서 비교하기등등의 방법을 고민할 것이다. 옵티마이저는 이러한 실행 계획을 통계 기반으로 추출해내는 것이라고 보면 쉽게 이해가 가능하다.