옵티마이저(Optimizer)는 데이터베이스가 SQL을 가장 빠르고 효율적으로 실행하기 위해 실행 계획(EXPLAIN PLAN)을 자동으로 만들어주는 엔진이야. SQL을 그대로 실행하지 않고, 어떻게 하면 최소 비용으로 결과를 낼 수 있을지 판단해서 최적의 방법을 선택하는 두뇌 같은 역할
✅ 옵티마이저가 하는 일
옵티마이저는 SQL을 받으면 다음을 판단한다
1) 어떤 인덱스를 사용할까?
예:
- WHERE name = '홍길동' → name 인덱스 사용
- WHERE age > 30 → range scan
- 혹은 인덱스 안 쓰고 full scan이 빠를 수도 있음
2) 어떤 조인 방식을 사용할까?
대표적인 조인 알고리즘:
- NL Join(Nested Loop Join)
- Hash Join
- Merge Join
데이터량, 정렬 여부, 인덱스 존재 여부로 판단됨.
3) 테이블을 어느 순서로 읽을까?
두 테이블 join 시:
- A → B 순서로 읽을지
- B → A 순서로 읽을지
순서만 바뀌어도 성능이 수백배 차이 남.
4) 통계 정보를 기반으로 비용(cost)을 계산
DB는 각 테이블의 통계 정보를 기반으로 비용을 예측해:
- 레코드 수
- 인덱스 카디널리티
- 데이터 분포 등
이를 "cost-based optimizer(CBO)" 라고 해.
요즘 오라클, MySQL, PostgreSQL 모두 CBO 기반.
🌟 옵티마이저의 핵심 개념
📌 1. RBO vs CBO
RBO (Rule Based Optimizer)
- 정해진 규칙(rule)에 따라 실행계획 결정
- 옛날 방식 → 지금은 거의 사용 안 함
CBO (Cost Based Optimizer)
- 비용(cost)을 계산하고 가장 낮은 비용의 실행계획 선택
- 현대 DB는 모두 CBO 사용
📌 2. 통계 정보가 매우 중요
옵티마이저는 통계 정보가 없으면 잘못된 실행 계획을 만들 가능성이 높아져.
그래서 DBA들이 주기적으로 analyze statistics 작업을 함.
📌 3. 실행 계획(EXPLAIN PLAN)
SQL을 실제로 어떻게 실행하는지 단계별로 보여주는 것.
예:
EXPLAIN
SELECT * FROM users WHERE age > 20;
결과:
- index range scan
- full table scan
- join 순서 등
이걸 보고 성능 튜닝을 진행하지.
🔥 옵티마이저가 중요한 이유
옵티마이저가 좋은 실행 계획을 세우면:
- SQL 속도가 수백배 빨라짐
- 서버 비용 절감
- 시스템 안정성 증가
반대로 잘못된 실행 계획을 선택하면:
- 불필요한 full scan 발생
- 대량 조인에 시간 폭발
- DB CPU 폭주 가능