옵티마이저
2025. 10. 21. 21:14

옵티마이저(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 폭주 가능
NellKiM
NellKiM