PostgreSQL

PostgreSQL: never executed

dewstream 2025. 11. 10. 08:00
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. 주로 발생하는 상황

상황설명
조건식이 항상 falseWHERE / 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