Search

REMINDER 11-06. Hash Join에서는 Build·Probe 입력의 필터 조건을 점검하자

⚠️
선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: DRCT 매장의 2023년 1~3월 준비 완료된 픽업 주문을 월별 매장 개설월로 집계한다. (원본 교재의 조인 사례를 간소화)

BAD SQL — 비교 대상

SELECT SUBSTRING(s.shop_start_ymd FROM 1 FOR 6) AS open_ym ,COUNT(*) AS ord_cnt FROM ms_shop_big AS s JOIN tr_ord_big AS o ON o.shop_id = s.shop_id WHERE s.shop_oper_tp = 'DRCT' AND o.ord_st = 'PKUP' AND o.prep_cmp_dtm >= TIMESTAMP '2023-01-01' AND o.prep_cmp_dtm < TIMESTAMP '2023-04-01' GROUP BY SUBSTRING(s.shop_start_ymd FROM 1 FOR 6);
SQL
복사

GOOD SQL — 개선 후보

-- 동일 SQL, 주문의 기간 조건을 지원하는 인덱스가 -- 적절한지 검토 (교재 x16: prep_cmp_dtm) -- CREATE INDEX tr_ord_big_x16 ON tr_ord_big (prep_cmp_dtm); EXPLAIN (COSTS OFF) SELECT SUBSTRING(s.shop_start_ymd FROM 1 FOR 6) AS open_ym ,COUNT(*) AS ord_cnt FROM ms_shop_big AS s JOIN tr_ord_big AS o ON o.shop_id = s.shop_id WHERE s.shop_oper_tp = 'DRCT' AND o.ord_st = 'PKUP' AND o.prep_cmp_dtm >= TIMESTAMP '2023-01-01' AND o.prep_cmp_dtm < TIMESTAMP '2023-04-01' GROUP BY SUBSTRING(s.shop_start_ymd FROM 1 FOR 6);
SQL
복사
예상 실행계획 — 실측 아님
[가능한 Hash Join 계획] HashAggregate -> Hash Join Hash Cond: (o.shop_id = s.shop_id) -> Seq Scan / Index Scan on tr_ord_big Filter 또는 Index Cond: (ord_st / prep_cmp_dtm) -> Hash ← Build 입력 -> Seq Scan on ms_shop_big Filter: (shop_oper_tp = 'DRCT') [주의] Hash 노드 아래가 Build, 다른 입력은 Probe. Hash Join이라고 해서 조인 키 인덱스만으로 속도가 결정되지 않음.
Plain Text
복사

핵심

•
Hash Join은 한 입력 집합을 해시 테이블로 만들고(Build), 반대쪽으로 조회(Probe)한다. 조인 전에 각 입력 집합을 적절히 필터링하는 것이 중요하며, 조인 키 인덱스를 사용하는 NL Join과 판단 기준이 다를 수 있다.
원본 규칙: 개편 전 05-10.
💡
참고·예외
•
Hash의 Build 입력은 실제 계획에서 Hash 노드가 위치한 쪽으로 판단한다. 일반적으로 작을수록 유리하지만 통계와 메모리, I/O에 따라 선택이 달라진다. 인덱스 x16은 교재의 실험용이며 필요 데이터가 많으면 Seq Scan이 더 합리적일 수 있다. 원본 교재는 Hash Join을 강제·비교한 부분이 있어 기본 옵티마이저 선택과 구분한다.