1. 실행 계획이란?
실행 계획(Execution Plan)은 데이터베이스가 SQL문을 실행하기 위해 어떤 방식으로 데이터를 읽고 처리할지를 보여주는 설계도입니다. SQL 튜닝에서 실행 계획은 "문제를 찾는 지도"와 같습니다.
- 좋은 실행 계획 → 최소한의 자원으로 빠르게 데이터 검색
- 나쁜 실행 계획 → 불필요한 연산, 대량의 I/O, 느린 응답 속도
💡 즉, 실행 계획을 이해하면 왜 내 쿼리가 느린지를 눈으로 확인할 수 있습니다.
2. 실행 계획 보는 방법
DBMS마다 명령어는 다르지만, 대표적으로 다음과 같이 확인할 수 있습니다.
2.1 Oracle
EXPLAIN PLAN FOR
SELECT FROM employees WHERE department_id = 10;
SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);
2.2 MySQL
EXPLAIN
SELECT FROM employees WHERE department_id = 10;
2.3 PostgreSQL
EXPLAIN ANALYZE
SELECT FROM employees WHERE department_id = 10;
Tip: EXPLAIN만 사용하면 예상 실행 계획, EXPLAIN ANALYZE는 실제 실행 결과까지 볼 수 있습니다.
3. 실행 계획의 주요 용어
실행 계획을 읽으려면 아래 요소를 꼭 알아야 합니다.
용어 | 의미 | 핵심 포인트 |
Operation | 수행 연산 (FULL SCAN, INDEX SCAN 등) | 접근 방식 파악 |
Object Name | 사용한 테이블/인덱스 이름 | 어떤 인덱스를 쓰는지 확인 |
Rows | 예측 결과 행 수 | 예상 행 수가 실제와 다르면 통계 갱신 필요 |
Cost | DB가 계산한 상대적 비용 | 낮을수록 유리 |
Predicate | 조건절 정보 | 필터링 위치 확인 가능 |
4. 주요 접근 방식(Access Path)
실행 계획에서 Operation 컬럼을 보면 접근 방식이 나옵니다.
1. Full Table Scan
- 모든 데이터를 읽는 방식
- 소량 데이터에서는 괜찮지만, 대량 데이터에서는 느림
- 인덱스를 활용할 수 없는 경우 발생
2. Index Range Scan
- 인덱스를 범위 조건으로 탐색
- 조건절에 인덱스 컬럼이 포함될 때 효율적
3. Index Unique Scan
- 유니크 인덱스를 통한 단일 검색
- Primary Key, Unique Key 검색에 최적
4. Index Full Scan
- 인덱스 전체를 순차적으로 탐색
- 주로 정렬, 그룹핑 최적화에 사용
5. 실행 계획 분석 예시
다음 두 쿼리를 비교해 보겠습니다.
-- 인덱스 없는 경우
EXPLAIN SELECT FROM employees WHERE department_id = 10;
-- 인덱스 있는 경우
CREATE INDEX idx_dept ON employees(department_id);
EXPLAIN SELECT FROM employees WHERE department_id = 10;
결과 차이
- 인덱스 없는 경우 → Full Table Scan
- 인덱스 있는 경우 → Index Range Scan
→ 같은 데이터라도 접근 방식이 달라져 성능이 향상됩니다.
6. 실행 계획 해석 & 튜닝 절차
- 실행 계획 확인 — EXPLAIN으로 현재 쿼리 실행 계획 분석
- 비효율적 연산 식별 — Full Table Scan, Nested Loop 과다 여부 확인
- 통계 정보 최신화 — ANALYZE TABLE, DBMS_STATS로 테이블 통계 갱신
- 인덱스 최적화 — 필요한 컬럼에 인덱스 추가/수정
- 쿼리 리팩토링 — 서브쿼리 제거, 조인 순서 변경, 필요 없는 컬럼 제거
- 재검증 — 수정 후 다시 실행 계획 확인
7. 실무 팁
- 실행 계획에서 Rows 예측값과 실제 처리 건수가 차이 크면 통계 정보를 의심
- 비효율적인 조인 순서는 JOIN 순서 변경 또는 힌트 사용으로 개선 가능
- 인덱스 스캔 후 테이블 접근(ROWID Lookup)이 많은 경우, Covering Index로 변경
- 개발 단계에서부터 실행 계획 점검 습관 들이기
8. 결론
실행 계획은 SQL 튜닝의 출발점이자 나침반입니다. 쿼리 속도가 느릴 때 무작정 인덱스를 추가하는 것이 아니라,
실행 계획 → 문제 원인 파악 → 개선 → 재검증의 과정을 거쳐야 안정적으로 성능을 올릴 수 있습니다.