5.3 Merge join과 join order
Merge join은 두 입력이 join key 순서로 정렬돼 있을 때 함께 전진하며 equality join을 수행합니다. Index가 ordering을 제공하거나 sort 비용이 다른 대안보다 낮을 때 선택되기도 합니다.
EXPLAIN (ANALYZE, BUFFERS)
SELECT *
FROM orders o
JOIN customers c ON c.id = o.customer_id
ORDER BY c.id;
Plan에서 각 입력의 Sort 또는 Index Scan과 Merge Cond를 확인합니다. Sort가 disk로 spill하면 merge join 자체보다 준비 비용이 커질 수 있습니다.
Join order
Table이 많아지면 가능한 join order가 급격히 늘어납니다. Planner는 join_collapse_limit과 GEQO 기준 안에서 search합니다. 설정을 바꾸기 전에 다음을 확인합니다.
- 가장 선택적인 filter가 일찍 적용되는가?
- Foreign key와 unique constraint가 정확한가?
- Join column statistics가 최신인가?
- CTE와 subquery가 optimization boundary를 만드는가?
- Outer join 의미 때문에 순서가 제한되는가?
SQL을 강제로 재작성해 order를 고정하면 data 변화에 취약할 수 있습니다. Estimate 원인을 수정하고 여러 parameter로 회귀 검증합니다.