선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 05-07과 동일한 SQL을 회원ID 단일 인덱스와 회원ID·주문일시 복합 인덱스로 비교한다.
BAD SQL — 비교 대상
-- x11(mbr_id)만 사용하는 상황
SELECT m.mbr_id, SUM(o.ord_amt) AS ord_amt
FROM ms_mbr_big AS m
JOIN tr_ord_big AS o
ON o.mbr_id = m.mbr_id
WHERE m.mbr_gd = 'PLAT'
AND m.join_tp = 'INV'
AND o.ord_dtm >= TIMESTAMP '2023-12-21'
AND o.ord_dtm < TIMESTAMP '2023-12-26'
GROUP BY m.mbr_id;
SQL
복사
GOOD SQL — 개선 후보
-- 교재의 복합 인덱스 후보 x12
-- CREATE INDEX tr_ord_big_x12 ON tr_ord_big (mbr_id, ord_dtm);
SELECT m.mbr_id, SUM(o.ord_amt) AS ord_amt
FROM ms_mbr_big AS m
JOIN tr_ord_big AS o
ON o.mbr_id = m.mbr_id
WHERE m.mbr_gd = 'PLAT'
AND m.join_tp = 'INV'
AND o.ord_dtm >= TIMESTAMP '2023-12-21'
AND o.ord_dtm < TIMESTAMP '2023-12-26'
GROUP BY m.mbr_id;
SQL
복사
예상 실행계획 — 실측 아님
[x11 (mbr_id)로 NL JOIN하는 경우]
Nested Loop
-> 회원 집합
-> Index Scan using tr_ord_big_x11
Index Cond: (mbr_id = m.mbr_id)
Filter: (ord_dtm >= ... AND ord_dtm < ...)
→ 회원의 다른 날짜 주문도 후보가 되어 힙 접근 가능
[x12 (mbr_id,ord_dtm)로 NL JOIN하는 경우]
Nested Loop
-> 회원 집합
-> Index Scan using tr_ord_big_x12
Index Cond: (mbr_id = m.mbr_id
AND ord_dtm >= ... AND ord_dtm < ...)
→ 회원 + 주문일시를 함께 인덱스에서 제한
Plain Text
복사
핵심
•
NL Join의 반복 검색에서 조인 조건만 사용하는 인덱스보다, 조인 조건과 필터 범위가 맞는 복합 인덱스가 테이블 접근을 크게 줄일 수 있다.
원본 규칙: 개편 전 05-08.
참고·예외
•
PG 교재에서 x11/x12를 비교한 논리를 따른 예상 계획이다. 실제 데이터 분포와 이미 존재하는 다른 인덱스를 고려해야 하며, 복합 인덱스 추가가 무조건 답은 아니다. 복합 인덱스 설계 원리는 아래 PART B의 선택 심화에서 다룬다.



