대덕인재/Oracle

[Oracle D-16] 비트맵 인덱스(Bitmap Index)

꼬마버거 2025. 4. 22. 18:54

✅ 비트맵 인덱스란?

데이터 값을 0과 1(비트)의 조합으로 표현해서 빠르게 검색하는 인덱스야.

📌 특히 **"값의 종류가 적고 중복이 많은 컬럼"**에 아주 효과적이야!


🎯 예를 들어보자!

📋 직원 테이블

 

사번 성별
1001 M
1002 F
1003 M
1004 F

👉 비트맵 인덱스를 만들면?

  • M 컬럼 인덱스: 1 0 1 0
  • F 컬럼 인덱스: 0 1 0 1

→ 각 값마다 해당 위치에 1 또는 0으로 표시된 벡터(행렬)을 만들어 놓는 거야.


✅ 왜 좋을까?

🔥 1. 조건 검색이 빠름

WHERE 성별 = 'M'

👉 1 0 1 0 비트 벡터로 바로 검색 가능!

 

🔥 2. 복잡한 조건도 쉽게 계산

WHERE 성별 = 'M' AND 부서 = '영업'

→ 두 비트맵을 AND 연산해서 바로 결과를 도출!


✅ 언제 사용해야 할까?

 

상황 설명
🔁 값이 반복되는 컬럼 예: 성별, 부서, 지역 등
📉 값 종류가 적은 경우 예: Y/N, 1/0, 등급(1~5) 등
🔒 데이터 수정이 적은 경우 UPDATE, DELETE가 많으면 비효율적

❌ 주의할 점

 

항목 설명
🔨 데이터 변경이 많으면 느려져 인덱스 재정비 비용이 큼
👥 다중 사용자가 동시에 수정하면 충돌 우려 병행처리에 약함
📦 PK 컬럼에는 적합하지 않음 범위가 넓고 고유해야 하니까!

✅ 비트맵 인덱스 만들기

CREATE BITMAP INDEX idx_gender
ON employees(gender);

→ 일반 인덱스는 CREATE INDEX, 비트맵 인덱스는 CREATE BITMAP INDEX


✅ 비트맵 인덱스 vs B-Tree 인덱스


 

비교 항목 비트맵 인덱스 B-Tree 인덱스
대상 컬럼 중복 많은 컬럼 고유한 값이 많을 때
성능 조건이 많은 SELECT에 빠름 INSERT/UPDATE/DELETE가 많은 경우 적합
사용 예시 성별, 지역, 상태 사번, 이름, 전화번호 등

💡 정리 한줄 요약!

비트맵 인덱스는 '중복 많고, 자주 안 바뀌는 컬럼'에 쓰면 성능 짱짱!
단, 데이터 자주 바뀌는 테이블에는 쓰면 오히려 느려질 수 있어 ❌