실행 계획
Execution Plan
쿼리 실행 방법 설명. EXPLAIN 명령으로 확인.
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가 적정한지 확인하는 습관을 들이세요.