본문 바로가기
프로그래밍/Database

PostgreSQL 실행 계획(Execution Plan)을 읽는 순서

by freeelifee 2024. 12. 12.
728x90

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`를 해시 조인합니다.

이렇게 실행 계획을 단계별로 읽어나가면, 쿼리가 실제로 어떻게 수행되는지를 이해할 수 있습니다. 

이 정보를 바탕으로 쿼리를 최적화하거나 인덱스를 추가하는 등의 작업을 할 수 있습니다.

728x90

'프로그래밍 > 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