복합 인덱스
: 두 개 이상의 컬럼을 조합해서 만든 인덱스
→ 조건이 두 개 이상일 때 사용
Index Scan vs Bitmap Heap Scan
Index Scan
- 조건이 매우 좁고 정확할 때
- 조건이 걸린 row 바로 가져옴
- row 수 적을 때 사용
Bitmap Heap Scan
- 조건이 넓거나 row가 많을 때
- 인덱스 위치를 모아놓고 한 번에 Heap 접근
- row 수 많을 때 사용
단일 인덱스 사용
Index = (customer_id)
CREATE INDEX idx_rental_cust ON rental(customer_id);
실행계획
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM rental
WHERE customer_id = 75
AND return_date IS NULL;
![[SQLP] 성능 튜닝 실습1: 복합 인덱스 - undefined - undefined - 단일 인덱스 사용 [SQLP] 성능 튜닝 실습1: 복합 인덱스 - undefined - undefined - 단일 인덱스 사용](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
- Index Cond: (customer_id = 75) → return_date 조건은 인덱스에 없음
- rows= 41 → 후보 row 41개
- Filter: return_date IS NULL → 인덱스로 못 거름, Heap에서 따로 검사하여 필터링
- Rows Removed by Filter: 38 → 38개 삭제 (실제 조건에 맞는 row 는 3개)
- Heap Blocks: 36 → 블록 36개에 접근
- Execution Time : 0.842 ms → 빠르지만 데이터 낭비 큼
복합 인덱스 사용
index = (customer_id, return_date)
CREATE INDEX idx_rental_cust_return ON rental(customer_id, return_date);
실행 계획
![[SQLP] 성능 튜닝 실습1: 복합 인덱스 - undefined - 모든 영역 [SQLP] 성능 튜닝 실습1: 복합 인덱스 - undefined - 모든 영역](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
- Index Cond: ((customer_id = 75) AND (return_date IS NULL)) → 두 조건 모두 인덱스 처리
- Filter X → 후보를 다 인덱스에서 정확하게 추출
- Buffers: shared hit=3, read=2 → 최소 블록만 읽음
- Execution Time: 0.078 ms → 속도 약 10배 상승
복합 인덱스 효과
- 불필요한 row 처리 가능
- 최소 블록만 읽음
- 실행시간 약 10배 단축
댓글