본문으로 건너뛰기

5.2 Hash join

Hash join은 equality 조건에서 한쪽 입력으로 hash table을 만들고 다른 입력을 probe합니다. 일반적으로 작은 입력이 build side가 됩니다.

EXPLAIN (ANALYZE, BUFFERS)
SELECT c.region, count(*)
FROM orders o
JOIN customers c ON c.id = o.customer_id
GROUP BY c.region;

Hash node에서 Buckets, Batches, Memory Usage를 확인합니다. Batches > 1이면 memory에 모두 담지 못해 temporary I/O가 발생했을 가능성이 큽니다.

Memory 계산의 함정

work_mem은 query 전체 한 번이 아니라 동시에 실행되는 sort와 hash operation마다 적용될 수 있습니다. hash_mem_multiplier도 영향을 줍니다. Concurrency를 무시하고 값을 크게 올리면 host memory pressure로 이어집니다.

Hash join 입력 row estimate가 틀리면 예상보다 큰 hash table과 batch가 생깁니다. 먼저 statistics와 filter pushdown을 확인합니다.

Skew가 심한 key는 bucket 분포와 join output을 키울 수 있습니다. 가장 흔한 key와 null 처리, uniqueness를 확인합니다. Hash join은 output ordering을 제공하지 않으므로 뒤의 sort 비용도 plan 전체에서 봅니다.