DB/SQLP

[SQLP] 성능 튜닝 실습1: 복합 인덱스

chantant sous la pluie 2025. 5. 28.

복합 인덱스

: 두 개 이상의 컬럼을 조합해서 만든  인덱스

 → 조건이 두 개 이상일 때 사용

 

 

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 - 단일 인덱스 사용

  • 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 - 모든 영역

  • 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배 단축

 

 

댓글