🗄️ 데이터베이스

실행 계획

Execution Plan

쿼리 실행 방법 설명. EXPLAIN 명령으로 확인.

상세 설명

실행 계획(Execution Plan)은 데이터베이스가 SQL 쿼리를 어떻게 처리할지 보여주는 로드맵입니다. 쿼리 옵티마이저가 여러 실행 방법 중 가장 효율적이라고 판단한 방법을 선택하며, EXPLAIN 명령으로 확인할 수 있습니다.

실행 계획에는 테이블 접근 방식(Full Scan, Index Scan 등), 조인 방법(Nested Loop, Hash Join, Merge Join), 정렬 방식, 예상 비용과 행 수 등의 정보가 포함됩니다. 이를 분석하면 쿼리의 병목 지점을 찾아 최적화할 수 있습니다.

실행 계획은 데이터 분포, 인덱스 통계, 시스템 자원 등에 따라 달라질 수 있습니다. 따라서 운영 환경과 유사한 데이터로 테스트하는 것이 중요하며, ANALYZE 명령으로 실제 실행 통계를 확인하는 것이 좋습니다.

코드 예제

-- MySQL EXPLAIN
EXPLAIN SELECT e.name, d.name as dept_name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 5000000;

-- EXPLAIN ANALYZE (실제 실행 통계 포함)
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';

-- PostgreSQL 상세 실행 계획
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT c.name, COUNT(o.id) as order_count
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name
HAVING COUNT(o.id) > 5;

-- 실행 계획 결과 예시 (MySQL)
/*
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | e     | ALL  | NULL          | NULL | NULL    | NULL | 1000 | Using where |
|  1 | SIMPLE      | d     | ref  | PRIMARY       | PRIMARY| 4     | db.e.dept| 1 | NULL       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

type 컬럼 해석:
- ALL: Full Table Scan (최악)
- index: Full Index Scan
- range: Index Range Scan
- ref: Index 조회
- eq_ref: Unique Index 조회
- const: Primary Key 조회 (최적)
*/

-- 인덱스 힌트로 실행 계획 변경
SELECT /*+ INDEX(orders idx_order_date) */
    order_id, customer_id
FROM orders
WHERE order_date > '2024-01-01';

실무 대화 예시

백엔드 개발자: 이 쿼리가 갑자기 느려졌어요. 어제까지 잘 됐는데요.

DBA: EXPLAIN ANALYZE 돌려보셨어요? 실행 계획이 바뀌었을 수도 있어요.

백엔드 개발자: Full Table Scan이 뜨네요. 분명 인덱스 있는데요.

DBA: 통계 정보가 오래된 것 같아요. ANALYZE TABLE 실행하고 다시 확인해보세요.

면접관: 실행 계획에서 주로 어떤 부분을 확인하시나요?

지원자: 먼저 type 컬럼을 봐서 ALL이면 Full Scan이니 인덱스 추가를 고려합니다. rows 컬럼으로 예상 처리 행 수를 확인하고, Extra에서 Using filesort나 Using temporary가 있으면 정렬이나 임시 테이블 최적화를 검토합니다.

면접관: 예상과 실제가 다를 때는요?

지원자: EXPLAIN ANALYZE로 실제 실행 통계를 확인합니다. 통계 정보가 오래됐으면 ANALYZE로 갱신하고, 필요시 힌트를 사용합니다.

시니어: PR 올리기 전에 주요 쿼리 실행 계획 확인했어요?

주니어: 실행 계획요? 쿼리 결과만 봤는데요.

시니어: 데이터 많아지면 성능 문제 생길 수 있어요. EXPLAIN으로 Full Scan 없는지, 예상 rows가 적정한지 확인하는 습관을 들이세요.

주의사항

관련 용어

더 배우기