본문 바로가기
Oracle

SQL 실행계획(Explain Plan) 해석/읽는 법

by 라탐 2023. 3. 20.

SQL을 이용해 업무를 하다 보면

작업 속도가 너무 안 나와 답답할 때가 많다.

 

그럴 땐 실행계획(Explain Plan)을 확인해봐야 할 테다.

 

SQL 실행 계획을 정확하게 읽고 분석하는 것은 

초보자에게 쉬운 일은 아니다.

 

나는 IT가 아니기에 디테일한 구조와 원리까진 모르겠지만,

그래도 SQL 유저라고 한다면 실행 계획 정도는 확실히 알고 가야 하겠다.

 

일단 실행 계획을 읽고 해석하는 방법부터 익혀 보자.

 

실행계획의 단계 단계를 '스텝'이라고 한다.

각 스텝별로 그 단계에서 어떤 명령이 어떻게 수행되었고, 총

몇 건의 데이터가 처리되었으며,

이를 위해 얼마만큼의 비용과 시간이 들었는지가 표시된다.

 

실행계획을 읽기 위해서는 아래 세 가지의 규칙만 기억하면 된다.

 

1. 위에서 아래로 읽어 내려가면서 제일 먼저 읽을 스텝 찾기

2. 내려가는 과정에서 같은 들여 쓰기가 존재하면, 무조건 위에서 아래 순으로 읽기

3. 읽고자 하는 스텝보다 들여쓰기가 된 하위 스텝이 존재한다면, 가장 안쪽으로 들여쓰기 된 스텝을 시작으로 하여 한 단계씩 상위 스텝으로 읽어 나오기

 

심플한 예제를 보자.

 

 

Id Operation Name Rows Bytes Cost(%CPU) Time
0 select cstmer_no   1 87 3(0) 00:00:01
* 1     table access full tbwcstmr 1 87 3(0) 00:00:01

 

실행 계획을 읽는 순서, 즉 SQL 이 수행되는 순서는 다음과 같다.

ID 1 → 0

 

하나의 예를 더 보자.

 

Id Operation Name Rows Bytes Cost(%CPU) Time
0 select cstmer_no   3 300 4(0) 00:00:01
1     nested loops   3 300 4(0) 00:00:01
* 2         index unique scan px_cstmr 1 13 1(0) 00:00:01
* 3         table access full tbwcstmr 3 261 3(0) 00:00:01
 

 

이 같은 경우, 위에서 아래로 읽어가는 중에, 같은 들여 쓰기로 되어 있는 스텝이 존재하는 것을 볼 수 있다.

같은 들여 쓰기에 대해서는 위에서 아래로, 즉 ID 2를 먼저 수행하고 ID 3을 읽어 수행한다.

순서는 다음과 같다.

ID 2 → 3 → 1 → 0

 

이번엔 좀 더 섞여 있는 예를 보자.

 

Id Operation Name Rows Bytes Cost(%CPU) Time
0 select cstmer_no       3(100)  
1     nested loops   1 117 3(0) 00:00:01
2         table access by insex rowid tbwcstmr 1 87 2(0) 00:00:01
* 3             index unique scan pk_cstmr 1   1(0) 00:00:01
4         table accescc by index rowid tbwcard 409 12270 1(0) 00:00:01
* 5             index unique scan pk_card 1   0(0)  

 

 위에서 아래로 읽어 가는 중, 같은 들여 쓰기로 되어 있는 스텝 ID 2와 4가 보인다.

같은 스텝에 대해서는 위에서 아래로 즉, ID 2를 읽고, ID 4를 나중에 읽는다.

하지만 ID 2를 읽으려니, 한번 더 들여 쓰기가 된 ID 3이 존재하므로, ID 3을 먼저 읽고 ID 2를 읽게 된다.

또, 스텝 ID 4를 읽을 때도 하위 스텝인 ID 5가 존재하므로, ID 5를 읽고 나서 ID 4를 읽게 된다.

순서는 다음과 같다.

ID 3 → 2 → 5 → 4 →1 → 0

 

마지막 예이다.

 

Id Operation Name Rows Bytes Cost(%CPU) Time
0 select cstmer_no   14 1638 17(0) 00:00:01
1     nested loops   1      
2         nested loops   14 1638 17(0) 00:00:01
3             table access full tbwcstmr 14 1218 3(0) 00:00:01
* 4             indes unique scan pk_cstmr 1   0(0) 00:00:01
5         table accescc by index rowid tbwcard 1 30 1(0) 00:00:01

 

실행계획을 읽는 순서는 다음과 같다.

ID 3 → 4 → 2 → 5 → 1 → 0