본문 바로가기
DBMS/데이터베이스

[데이터베이스] 옵티마이저(Optimizer) 개념에 대해

by 클레어몬트 2025. 4. 18.

ㅁ옵티마이저(Optimizer): SQL 쿼리를 가장 효율적으로 실행하기 위한 실행 계획(Execution Plan)을 선택하는 DBMS의 내부 컴포넌트

즉, 다음과 같은 질문에 답하기 위한 내부 판단 시스템이다

  • 어떤 인덱스를 사용할까?
  • 테이블 조인은 어떤 순서로 할까?
  • 풀 테이블 스캔이 더 나을까, 인덱스 스캔이 더 나을까?

 

(옵티마이저 종류 2가지)

  • 규칙 기반 옵티마이저(Rule-Based Optimizer, RBO)
    정해진 규칙에 따라 실행 계획을 선택한다. 예를 들어, 인덱스가 있으면 무조건 인덱스를 사용하는 식이다. 단순하고 예측 가능하지만, 다양한 상황에 유연하게 대응하지 못한다는 단점이 있다.
  • 비용 기반 옵티마이저(Cost-Based Optimizer, CBO)
    테이블의 행 수, 인덱스 유무, 통계 정보 등을 바탕으로 각 실행 계획의 비용을 계산하여 가장 효율적인 경로를 선택한다. 현재 대부분의 RDBMS는 CBO를 채택하고 있다.

 

 

그러면 여기서 실행 계획(Execution Plan)이란 무엇일까?

옵티마이저가 선택한 실행 계획은 EXPLAIN 키워드를 통해 확인할 수 있다. 이를 통해 쿼리가 어떤 방식으로 처리되는지, 인덱스가 사용되는지 여부, 조인 순서 등을 파악할 수 있으며, 성능 튜닝에 있어 매우 중요한 자료가 된다.

오라클 실행 계획(Execution Plan) 화면

 

힌트(Hint)란?

힌트는 쿼리 실행 시 옵티마이저에게 특정 실행 계획을 강제하거나 유도하기 위해 사용되는 지시어이다
쉽게 말하면, "이 인덱스를 꼭 써줘!", "먼저 이 테이블부터 조인해줘!"와 같은 개발자의 의도를 명시적으로 전달하는 방법이다

 

[DBMS별 힌트 지원 여부 및 특징]

PostgreSQL은 명시적인 힌트를 제공하지 않는 철학을 갖고 있어 간접적으로 조절하는 방식만 허용된다!

 

특히 오라클의 옵티마이저와 힌트는 특히 정교하고 고도화되어 있어 많이 언급되는 편이다.

오라클에서의 옵티마이저 실행 계획(Execution Plan)과 힌트 사용 방법은 아래 글을 참고하자

https://claremont.tistory.com/entry/Oracle-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%87%BC%ED%95%91%EB%AA%B0-DB-JOININDEX-%EC%8B%A4%EC%8A%B5

 

[Oracle] 온라인 쇼핑몰 DB: JOIN/INDEX 실습

https://claremont.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-SQL-JOIN-INDEX-%EA%B0%9C%EB%85%90 [데이터베이스] SQL JOIN + INDEX 개념평소에 SKALA 팀원분들과 얘기를 할 때 컴공식 유머를 발휘하는데,

claremont.tistory.com

 

힌트 사용 시 유의사항

힌트는 성능 문제를 해결할 수 있는 강력한 도구이지만, 무분별하게 사용할 경우 오히려 성능을 저하시키거나 유지보수를 어렵게 만들 수 있다. 특히 데이터 분포가 바뀌거나 인덱스 구조가 변경될 경우, 이전에 유효했던 힌트가 오히려 병목을 유발할 수도 있다. 따라서 힌트는 다음과 같은 상황에서 신중하게 적용하는 것이 바람직하다.

 

1. 옵티마이저가 잘못된 실행 계획을 반복적으로 선택하는 경우

2. 쿼리 성능이 미션 크리티컬(Mission-Critical)한 수준일 경우

3. 실행 계획을 강제로 고정해야 하는 경우 (예: 대량 배치 처리)

 

 

 

 

 

#SK, #SKALA, #SKALA1기