728x90
※ PostgreSQL: never executed.
안녕하세요. 듀스트림입니다.
PostgreSQL 실행계획을 보면 어떤 노드 옆에 "never executed"라는 문구가 표시될 때가 있습니다.
이건 꽤 중요한 의미를 가지는 지표라서 오늘 포스팅에서 한번 설명드리겠습니다.
1. never executed의 의미
never executed는 해당 실행 계획 노드(Plan Node)가 실제 실행 중 단 한 번도 수행되지 않았음을 의미합니다.
즉, 실행 계획 상으로는 존재하지만, 런타임 시 조건문이나 상위 노드의 제어 흐름 때문에 해당 노드가 호출되지 않은 것입니다.
예를 들어:
EXPLAIN (ANALYZE, BUFFERS)
SELECT *
FROM orders o
WHERE o.id IN (
SELECT id FROM customers WHERE country = 'KR' AND false
);→ 이 쿼리의 서브쿼리는 AND false 조건 때문에 항상 false가 되어 실제로 실행되지 않습니다.
이럴 경우 실행계획에서 이렇게 보일 수 있습니다:
Seq Scan on customers (never executed)
Filter: (country = 'KR' AND false)2. 주로 발생하는 상황
| 상황 | 설명 |
| 조건식이 항상 false | WHERE / JOIN 조건에 의해 하위 노드가 수행되지 않음 |
| LIMIT / OFFSET / EXISTS 최적화 | 상위 노드가 결과를 충분히 얻어 하위 노드를 더 이상 실행하지 않음 |
| LEFT JOIN의 inner scan이 필요 없을 때 | outer 쪽 조건이 만족하지 않아 inner 쪽이 호출되지 않음 |
| CASE WHEN 등 제어 흐름 | 조건 분기 내 특정 부분이 실행되지 않음 |
| CTE나 서브쿼리가 최적화로 skip됨 | planner가 필요 없다고 판단해 실행 안 함 (예: dead subplan) |
예를 하나 더 들어보겠습니다:
EXPLAIN (ANALYZE)
SELECT *
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'JP' AND o.amount > 100;Nested Loop Left Join
-> Seq Scan on customers c
Filter: (country = 'JP')
-> Index Scan on orders o (never executed)
Index Cond: (customer_id = c.id)
Filter: (amount > 100)
왜 이런 실행계획이 나왔을까요?
- 이유는 LEFT JOIN의 outer 쪽(customers)에서 country = 'JP' 조건이 만족되지 않으면, inner 쪽(orders)을 조회할 필요가 없기 때문입니다.
- 즉, planner는 join plan을 세웠지만 runtime 시에는 실제 호출되지 않은 것입니다.
정리하자면,
- never executed는 비효율의 신호가 아니라 "runtime 상 불필요했던 경로"를 알려주는 진단 정보입니다.
- 하지만 빈번하게 발생한다면, 쿼리 로직이나 조건이 planner 수준에서 과도하게 복잡하거나 불필요한 subplan을 포함하고 있는지를 점검해야 합니다. (OR 구문 내부의 불필요한 서브쿼리, UNION ALL 중 항상 비어있는 브랜치 등)
오늘은 여기까지~
728x90
'PostgreSQL' 카테고리의 다른 글
| PostgreSQL: DISTINCT ON (0) | 2025.11.19 |
|---|---|
| PostgreSQL: 스트리밍 복제 지연 (0) | 2025.11.12 |
| PostgreSQL: ctid (0) | 2025.11.07 |
| PostgreSQL: Heap Table Structure (0) | 2025.11.05 |
| PostgreSQL: Heap Fetch (0) | 2025.11.03 |