Search

REMINDER 11-03. Bitmap Index Scan과 Index Scan은 역할이 다르다

⚠️
선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 매장 S033의 2023년 3월 주문을 주문일시 순으로 검색한다.

BAD SQL — 비교 대상

-- 동일한 SQL의 가능한 접근 방법 A : Bitmap 계열 SELECT o.ord_no, o.ord_dtm FROM tr_ord_big AS o WHERE o.shop_id = 'S033' AND o.ord_dtm >= TIMESTAMP '2023-03-01' AND o.ord_dtm < TIMESTAMP '2023-04-01' ORDER BY o.ord_dtm, o.ord_no;
SQL
복사

GOOD SQL — 개선 후보

-- 동일한 SQL의 가능한 접근 방법 B : B-tree 순서 활용 -- 두 계획 중 하나를 무조건 강제하는 것이 목적은 아니다. SELECT o.ord_no, o.ord_dtm FROM tr_ord_big AS o WHERE o.shop_id = 'S033' AND o.ord_dtm >= TIMESTAMP '2023-03-01' AND o.ord_dtm < TIMESTAMP '2023-04-01' ORDER BY o.ord_dtm, o.ord_no;
SQL
복사
예상 실행계획 — 실측 아님
[가능한 접근 A - x02(shop_id), x01(ord_dtm) 조합] Sort Sort Key: ord_dtm, ord_no -> Bitmap Heap Scan on tr_ord_big Recheck Cond: ... -> BitmapAnd -> Bitmap Index Scan using tr_ord_big_x02 -> Bitmap Index Scan using tr_ord_big_x01 [가능한 접근 B - 적절한 복합 인덱스가 추가로 있다면] Index Scan using <shop_id,ord_dtm,ord_no 인덱스> Index Cond: (shop_id = ... AND ord_dtm >= ... AND ord_dtm < ...) → 정렬을 생략할 수 있는 경우
Plain Text
복사

핵심

•
Bitmap 방식은 여러 인덱스의 결과를 합치거나 힙 블록 접근을 묶는 데 유리할 수 있다. 그러나 Bitmap Heap Scan이 반환하는 행은 인덱스 정렬 순서를 보장하지 않으므로 ORDER BY를 위해 Sort가 필요할 수 있다.
원본 규칙: 개편 전 04-08.
💡
참고·예외
•
BitmapAnd가 항상 등장하는 것은 아니다. x02와 x01을 둘 다 갖고 있어도 옵티마이저는 한 개 인덱스 또는 Seq Scan을 선택할 수 있다. GOOD은 성능 보장이 아닌 정렬 인덱스의 가능성 설명이다.