선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 회원 M00861의 특정 기간 주문금액을 매장별로 집계한다.
BAD SQL — 비교 대상
-- 인덱스 x04 (mbr_id,ord_dtm) : 집계 컬럼 미포함
SELECT o.shop_id, SUM(o.ord_amt) AS ord_amt
FROM tr_ord_big AS o
WHERE o.mbr_id = 'M00861'
AND o.ord_dtm >= TIMESTAMP '2023-01-01'
AND o.ord_dtm < TIMESTAMP '2024-01-01'
GROUP BY o.shop_id;
SQL
복사
GOOD SQL — 개선 후보
-- 같은 SELECT, 제공 실습의 커버링 인덱스 후보
CREATE INDEX tr_ord_big_x06
ON tr_ord_big (mbr_id, ord_dtm)
INCLUDE (shop_id, ord_amt);
SELECT o.shop_id, SUM(o.ord_amt) AS ord_amt
FROM tr_ord_big AS o
WHERE o.mbr_id = 'M00861'
AND o.ord_dtm >= TIMESTAMP '2023-01-01'
AND o.ord_dtm < TIMESTAMP '2024-01-01'
GROUP BY o.shop_id;
SQL
복사
예상 실행계획 — 실측 아님
[x04를 사용하는 경우]
HashAggregate 또는 GroupAggregate
-> Index Scan using tr_ord_big_x04
Index Cond: (mbr_id = ... AND ord_dtm >= ... AND ord_dtm < ...)
→ shop_id, ord_amt를 얻기 위한 힙 접근이 필요
[x06을 사용하는 경우]
HashAggregate 또는 GroupAggregate
-> Index Only Scan using tr_ord_big_x06
Index Cond: (mbr_id = ... AND ord_dtm >= ... AND ord_dtm < ...)
Heap Fetches: 실행 환경에 따라 0 또는 0 초과
Plain Text
복사
핵심
•
INCLUDE 컬럼은 인덱스 키의 탐색 순서를 바꾸지 않으면서 SELECT·집계에 필요한 값을 인덱스에 포함할 수 있다. 조건과 출력 컬럼이 모두 인덱스에 있으면 Index Only Scan을 검토할 수 있다.
원본 규칙: 개편 전 04-06.
참고·예외
•
INCLUDE가 있다고 늘 Index Only Scan을 선택하는 것은 아니다. visibility map의 all-visible 상태에 따라 힙 확인(Heap Fetches)이 발생한다. 큰 인덱스는 공간·쓰기 비용을 증가시킨다. x06 DDL은 실습 자료에 실제 명시되어 있으나 여기서 실행하지 않았다.



