선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 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은 성능 보장이 아닌 정렬 인덱스의 가능성 설명이다.



