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
'Oracle' 카테고리의 다른 글
| [Oracle] 실행 계획(Execution plan)과 hint사용의 필요성 (0) | 2023.03.20 |
|---|---|
| 오라클(Oracle) 19c 클라이언트 - Instant client 설치 (0) | 2023.03.13 |
| Oracle APEX (0) | 2023.03.03 |
| 오라클 Core 라이선스 계산 기준 (0) | 2023.03.02 |
| [오라클] 전화번호 포맷 변경 쿼리 (하이픈, 자르기) (0) | 2023.03.02 |