본문 바로가기
카테고리 없음

SQL 튜닝 심화: 실행 계획(Execution Plan) 완전 정복

by 유형제맘 2025. 8. 8.

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. 실행 계획 해석 & 튜닝 절차

  1. 실행 계획 확인 — EXPLAIN으로 현재 쿼리 실행 계획 분석
  2. 비효율적 연산 식별 — Full Table Scan, Nested Loop 과다 여부 확인
  3. 통계 정보 최신화 — ANALYZE TABLE, DBMS_STATS로 테이블 통계 갱신
  4. 인덱스 최적화 — 필요한 컬럼에 인덱스 추가/수정
  5. 쿼리 리팩토링 — 서브쿼리 제거, 조인 순서 변경, 필요 없는 컬럼 제거
  6. 재검증 — 수정 후 다시 실행 계획 확인

7. 실무 팁

  • 실행 계획에서 Rows 예측값과 실제 처리 건수가 차이 크면 통계 정보를 의심
  • 비효율적인 조인 순서는 JOIN 순서 변경 또는 힌트 사용으로 개선 가능
  • 인덱스 스캔 후 테이블 접근(ROWID Lookup)이 많은 경우, Covering Index로 변경
  • 개발 단계에서부터 실행 계획 점검 습관 들이기

8. 결론

실행 계획은 SQL 튜닝의 출발점이자 나침반입니다. 쿼리 속도가 느릴 때 무작정 인덱스를 추가하는 것이 아니라,
실행 계획 → 문제 원인 파악 → 개선 → 재검증의 과정을 거쳐야 안정적으로 성능을 올릴 수 있습니다.