Search

REMINDER 11-02. INCLUDE와 Index Only Scan은 읽는 컬럼을 함께 고려하자

⚠️
선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 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은 실습 자료에 실제 명시되어 있으나 여기서 실행하지 않았다.