
SQL 쿼리는 작성하는 사람 입장에서 단순하지만, DBMS 입장에서는 효율적으로 실행할 수 있는 수많은 방법 중 하나를 선택해야 한다. 이때 어떤 방법이 가장 효율적인지를 판단하는 핵심 컴포넌트가 쿼리 옵티마이저(Query Optimizer)이다.
옵티마이저(Query Optimizer)는 사용자가 작성한 SQL 문장을 실제로 어떻게 실행할지를 결정하는 실행 계획(Execution Plan)을 생성하는 DBMS 내부 구성 요소이다.
즉, 여러 가지 가능한 실행 경로 중에서 가장 비용(cost)이 적게 드는 실행 계획을 선택하는 역할을 한다.
같은 SQL 문이라도 아래와 같은 요소에 따라 실행 성능은 크게 달라질 수 있다.
옵티마이저는 위 요소들을 고려하여, 최적의 실행 경로를 찾아내도록 설계되어 있다.
쿼리 옵티마이저는 다음과 같은 순서로 작동한다.
쿼리 파싱 (Parsing)
SQL 구문을 분석하여 의미를 파악한다.
실행 계획 후보 생성
여러 가지 가능한 실행 계획을 생성한다. 예를 들어 조인 순서, 인덱스 사용 유무 등 다양한 조합이 고려된다.
비용 계산 (Cost Estimation)
각 실행 계획에 대해 디스크 I/O, CPU 사용량 등을 바탕으로 비용을 추정한다.
최적의 계획 선택
추정된 비용이 가장 낮은 실행 계획을 선택한다.
| 종류 | 설명 |
|---|---|
| Rule-Based Optimizer | 정해진 규칙에 따라 실행 계획을 선택함. 오래된 방식으로 현재는 거의 사용되지 않음. |
| Cost-Based Optimizer | 통계 정보를 기반으로 각 실행 계획의 비용을 계산하고, 가장 효율적인 실행 경로를 선택함. 대부분의 현대 DBMS에서 사용됨. |
실행 계획은 SQL 쿼리를 실행하는 실제 경로를 의미한다. 예를 들어, 어떤 인덱스를 사용할지, 어떤 테이블을 먼저 읽을지 등을 구체적으로 기록한 계획이다.
DBMS는 옵티마이저가 선택한 실행 계획을 사용자가 직접 확인할 수 있도록 도와준다. 대표적인 명령어는 다음과 같다.
| DBMS | 실행 계획 확인 명령어 |
|---|---|
| Oracle | EXPLAIN PLAN FOR SELECT ..., AUTOTRACE |
| MySQL | EXPLAIN SELECT ... |
| PostgreSQL | EXPLAIN ANALYZE SELECT ... |
🧪 예시 쿼리와 실행 계획
SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE c.region = '서울';
위 쿼리에 대해 옵티마이저는 다음과 같은 실행 계획을 평가한다:
customers 테이블에서 먼저 region='서울' 조건을 필터링하고, 결과를 orders와 조인
전체 조인을 먼저 수행한 뒤 region='서울' 조건을 적용
인덱스를 사용할지, 풀 테이블 스캔을 할지 등
옵티마이저는 이 중에서 비용이 가장 적은 실행 방식을 선택한다.
| 항목 | 내용 |
|---|---|
| 정의 | SQL 실행 전, 최적의 실행 계획을 선택하는 DBMS의 컴포넌트 |
| 목적 | SQL 쿼리 성능 최적화 |
| 방식 | 대부분은 비용 기반 옵티마이저 사용 (Cost-Based) |
| 확인 방법 | EXPLAIN, EXPLAIN ANALYZE, AUTOTRACE 등 명령어로 실행 계획 확인 가능 |
쿼리 옵티마이저는 눈에 보이지 않지만, SQL 성능을 좌우하는 핵심 역할을 한다. 쿼리 튜닝 시 반드시 실행 계획을 확인하고, 인덱스 구성 및 쿼리 구조를 옵티마이저가 잘 선택할 수 있도록 설계해야 한다.