본문 바로가기

SQL & 데이터베이스/SQL 성능 최적화 & 튜닝

[SQL] SQL 실행 계획(EXPLAIN PLAN) 분석 및 최적화

📌 [SQL] SQL 실행 계획(EXPLAIN PLAN) 분석 및 최적화

📌 SQL 실행 계획(EXPLAIN PLAN)이란?

SQL 실행 계획(Execution Plan)은 쿼리가 데이터베이스에서 실행되는 방식을 보여주는 정보입니다.
올바르게 분석하면 쿼리 성능을 최적화하고 실행 속도를 개선할 수 있습니다.


📌 EXPLAIN PLAN 사용법

1️⃣ EXPLAIN PLAN 실행 방법

아래 명령어를 실행하면 실행 계획을 확인할 수 있습니다.


EXPLAIN PLAN FOR
SELECT * FROM employees WHERE salary > 5000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

위 명령어는 실행 계획을 저장한 후, DBMS_XPLAN.DISPLAY를 사용하여 조회합니다.

2️⃣ 실행 계획 결과 예제

아래와 같은 실행 계획이 출력될 수 있습니다.


--------------------------------------------------
| Id  | Operation         | Name      | Rows  |
--------------------------------------------------
|   0 | SELECT STATEMENT  |           |  1000 |
|   1 |  TABLE ACCESS FULL| EMPLOYEES |  1000 |
--------------------------------------------------

위 결과에서 TABLE ACCESS FULL이 나타나면 해당 테이블 전체를 검색하기 때문에 성능이 저하될 수 있습니다.


📌 실행 계획 분석 및 최적화 방법

1️⃣ 인덱스 활용 여부 확인

실행 계획에서 TABLE ACCESS FULL이 표시되면 인덱스가 사용되지 않은 것을 의미합니다.

해결 방법: 적절한 인덱스를 추가하여 쿼리 성능을 향상시킵니다.


CREATE INDEX idx_salary ON employees(salary);

이제 실행 계획을 다시 확인하면 INDEX RANGE SCAN이 표시될 가능성이 높습니다.

2️⃣ JOIN 최적화

실행 계획에서 NESTED LOOPS 또는 HASH JOIN이 표시될 수 있습니다.

예제 쿼리:


EXPLAIN PLAN FOR
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

만약 실행 계획에서 HASH JOIN이 표시되면 대량의 데이터가 조인되므로 성능 저하가 발생할 수 있습니다.

해결 방법: 조인 대상 컬럼에 인덱스를 추가하여 NESTED LOOPS로 변경 가능


CREATE INDEX idx_department ON employees(department_id);

3️⃣ WHERE 절 조건 최적화

실행 계획에서 FILTER가 많이 사용되면 불필요한 조건 검사가 많을 수 있습니다.

해결 방법: WHERE 절에서 함수를 사용한 조건을 제거하고 인덱스를 활용하도록 수정


-- 비효율적인 조건 (인덱스 미사용)
SELECT * FROM employees WHERE TO_CHAR(hire_date, 'YYYY-MM-DD') = '2024-01-01';

-- 최적화된 조건 (인덱스 활용)
SELECT * FROM employees WHERE hire_date = TO_DATE('2024-01-01', 'YYYY-MM-DD');

📌 실행 계획 최적화 요약

  • TABLE ACCESS FULL을 피하고 인덱스를 활용
  • JOIN 최적화: HASH JOIN이 아닌 NESTED LOOPS를 활용
  • WHERE 절에서 함수 사용을 최소화하여 인덱스 활용

🔍 결론

SQL 실행 계획(EXPLAIN PLAN)은 쿼리 성능을 분석하는 핵심 도구입니다.
위 방법을 적용하면 불필요한 전체 테이블 검색을 줄이고 실행 속도를 최적화할 수 있습니다! 🚀


📌 더 많은 SQL 튜닝 팁이 궁금하다면?

📌 다른 SQL 최적화 가이드도 함께 확인해보세요!