본문으로 건너뛰기

5.1 Nested loop

Nested loop는 outer row마다 inner plan을 실행합니다. Outer가 작고 inner lookup이 index로 빠르면 매우 효율적입니다.

EXPLAIN (ANALYZE, BUFFERS)
SELECT c.id, o.id, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.id BETWEEN 1 AND 10;

Inner node의 loops를 봅니다. 표시된 actual time과 rows는 loop당 평균이므로 총 작업량을 곱해 생각합니다.

느려지는 조건

  • Outer row estimate가 실제보다 매우 작음
  • Inner index가 없거나 selectivity가 낮음
  • Random heap access가 많음
  • 같은 inner lookup을 반복하지만 cache 이득이 적음
  • Parameter별 row 분포가 크게 다름

PostgreSQL은 Memoize node로 반복되는 parameter lookup 결과를 cache할 수 있습니다. Hit, miss, eviction과 memory usage를 확인합니다.

enable_nestloop=off는 대안 plan을 보는 진단 도구입니다. Nested loop가 왜 선택됐는지 row estimate와 cost를 고친 뒤 전체 workload에서 검증합니다.