사내 교육으로 듣게된 SQL 튜닝 기법에 대한 강의 내용을 정리해본다.
1. 실행계획의 정의
실행계획 : 사용자가 SQL을 실행하여 데이터를 추출하려고 할 때, 옵티마이저가 수립하는 작업절차, SQL의 Performance를 결정짓는 요인. 실행계획이 목적했던 대로 실행되지 않으면, SQL Performance에 문제가 발생함.
OPTIMIZER : SQL 해석 > 실행계획(데이터 처리 절차) 수립 > 실행
2. 실행계획의 확인 방법
오라클에서는 아래 명령어를 사용해 확인 가능함.
(특별한 권한부여가 필요 없다.)
*EXPLAIN PLAN
- SQL에 대한 실행계획만을 확인할 수 있음
- 명령을 사용할 때 데이터를 처리하지 않음. (DB에 부하를 미치지 않음.)
- 데이터를 읽지 않기에 소요시간과 I/O, Sorting 관련 정보는 확인이 어렵다.
*SET AUTOTRACE
- EXPLAIN PLAN 명령과 달리 한 번의 명령으로, 여러 개의 SQL에 대한 실행계획을 바로 볼 수 있음.
- 다양하게 옵션을 사용할 수 있어서 여러 가지의 정보를 선택적으로 확인할 수 있음. (SET AUTOTRACE 뒤에 ON EXPLAIN, ON STATISTICS, TRACEONLY, TRACEONLY EXPLAIN, TRACEONLY STATISTICS, OFF 등의 옵션들이 붙는다.)
큰 데이터에 대한 실행계획을 알아보기 위해서는 실제 데이터를 읽지 않는게 좋은 방법이지만, 데이터의 크기가 작다면 데이터를 읽어가면서 실행계획을 확인하는게 좋은 방법이 될 수 있다.
3. 실행계획 분석
실행계획은 데이터 처리를 위한 작업 방법으로, 실행계획을 구성하는 내용의 분석을 통해 SQL의 비효율적인 부분을 확인할 수 있음. 실행계획 분석을 통해 SQL이 작성자의 의도대로 실행되었는지 확인할 수 있으며, 그렇지 않았을 경우 성능상 문제가 되는 부분을 찾아낼 수 있음. 실행계획의 정확한 분석을 통해 SQL문장의 튜닝 포인트를 도출할 수 있음.
명령어 예시)
SET AUTOTRACE TRACEONLY EXPLAIN;
SELECT/*+USE_NL(e d) */
e.name, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
실행결과 예시)
ID | Opreation | Name
0 | SELECT STATMENT |
1 | NESTED LOOPS |
2 | NESTED LOOPS |
3 | TABLE ACCESS FULL | EMP
4 | INDEX UNIQUE SCAN | PK_DEPT
5 | TABLE ACCESS BY INDEX ROWID | DEPT
들여쓰기 depth가 같다면 위에 있는 것이 먼저 실행되며, 실행계획을 도식화하면 아래 트리구와 같다.

위 트리구조의 실행순서 : 3 -> 4 -> 2 -> 5 -> 1 -> 0
가장 먼저실행되는 것은 가장 왼쪽하단에 위치한 노드이며, 왼쪽 하단 노드 -> 오른쪽 하단 노드 -> 중간 상단 노드의 순서로 실행되는 트리구조이다.
'IT > SQL' 카테고리의 다른 글
| Nested Loop Join (0) | 2023.07.24 |
|---|---|
| 인덱스 활용이 불가능한 경우 (0) | 2023.07.23 |
| 결합 인덱스(Composite Index) (0) | 2023.07.19 |
| 인덱스(Index) (0) | 2023.07.15 |
| 옵티마이저(Optimizer) (0) | 2023.07.14 |