PostgreSQL 실행 계획(Execution Plan)을 읽는 순서는 다음과 같습니다.
실행 계획을 이해하면 쿼리가 어떻게 실행되는지, 어떤 최적화가 이루어지는지를 알 수 있습니다.
실행 계획의 주요 구성 요소
1. 순서(Order): 실행 계획은 항상 내부에서 외부로, 즉 들여쓰기 된 부분부터 읽어야 합니다. 들여쓰기가 많이 된 부분이 먼저 실행됩니다.
2. 노드(Node): 각 노드는 실행 계획의 단계(예: 테이블 스캔, 인덱스 스캔, 조인 등)를 나타냅니다.
3. 작업 타입(Operation Type): 각 노드는 수행할 작업의 종류를 표시합니다. 예를 들어 `Seq Scan`(순차 스캔), `Index Scan`(인덱스 스캔), `Nested Loop`(중첩 루프) 등이 있습니다.
4. 테이블(Table): 작업이 수행되는 테이블의 이름이 표시됩니다.
5. 조건(Conditions): 필터링 조건이나 조인 조건 등이 표시됩니다.
6. 비용(Cost): `cost=...` 부분은 해당 노드를 실행하는 데 드는 예상 비용을 나타냅니다. 첫 번째 숫자는 시작 비용(startup cost), 두 번째 숫자는 총 비용(total cost)입니다.
7. 행(Row): `rows=...` 부분은 해당 노드가 처리할 것으로 예상되는 행의 수를 나타냅니다.
8. 너비(Width): `width=...` 부분은 처리할 행의 평균 크기(바이트 단위)를 나타냅니다.
실행 계획 예시 및 해석
다음은 `EXPLAIN` 명령어로 생성된 실행 계획의 예시입니다:
EXPLAIN
SELECT * FROM a
JOIN b ON a.c1 = b.c1
JOIN c ON b.c1 = c.c1;
실행 계획 출력 예시:
```
Hash Join (cost=35.50..79.25 rows=1000 width=64)
Hash Cond: (b.c1 = c.c1)
-> Hash Join (cost=20.25..60.00 rows=1000 width=32)
Hash Cond: (a.c1 = b.c1)
-> Seq Scan on a (cost=0.00..21.00 rows=1000 width=16)
-> Hash (cost=15.00..15.00 rows=1000 width=16)
-> Seq Scan on b (cost=0.00..15.00 rows=1000 width=16)
-> Hash (cost=15.00..15.00 rows=1000 width=32)
-> Seq Scan on c (cost=0.00..15.00 rows=1000 width=32)
```
해석:
1. 가장 안쪽 단계 (Inner):
- `Seq Scan on a`: 테이블 `a`를 순차적으로 스캔합니다.
- `Seq Scan on b`: 테이블 `b`를 순차적으로 스캔합니다.
- `Hash`: `b`의 결과를 해시 테이블로 저장합니다.
2. 중간 단계 (Middle):
- `Hash Join`: `a`와 `b`를 해시 조인합니다.
3. 가장 바깥쪽 단계 (Outer):
- `Seq Scan on c`: 테이블 `c`를 순차적으로 스캔합니다.
- `Hash`: `c`의 결과를 해시 테이블로 저장합니다.
- `Hash Join`: 중간 결과(`a`와 `b`의 조인)와 `c`를 해시 조인합니다.
이렇게 실행 계획을 단계별로 읽어나가면, 쿼리가 실제로 어떻게 수행되는지를 이해할 수 있습니다.
이 정보를 바탕으로 쿼리를 최적화하거나 인덱스를 추가하는 등의 작업을 할 수 있습니다.
'프로그래밍 > Database' 카테고리의 다른 글
[Oracle] 테이블 건수 조회 (0) | 2023.11.06 |
---|---|
[dbeaver] 테이블명, 컬럼명 보이기 (0) | 2023.09.12 |
[PostgreSQL] 날짜/시간 (0) | 2022.04.28 |
Postgresql procedure (0) | 2022.02.10 |
PostgreSQL 에러 (0) | 2021.12.22 |