-
[인덱스 시리즈3] 데이터베이스 Bitmap IndexComputer Science/Database 2023. 1. 3. 22:00
여러 개의 search key으로 SQL 쿼리를 수행할 때 효율적인 Bitmap Index에 대해 살펴 보려고한다.
먼저, Bitmap Index란 무엇일까?
간단히 말해서 칼럼의 값들을 bit의 배열로 나타낸 것이다.
아래 예시를 보면서 더 자세히 알아보자
예시
예를 들어, 아래와 같은 테이블이 있다고 하자.
이 테이블의 gender 칼럼을 bitmap으로 나타낸다면 아래와 같이 나타낼 수 있다.
M 10010
F 01101
income_level을 bitmap으로 나타낸다면 아래와 같이 나타낼 수 있다.
L1 10100
L2 01000
L3 00001
L4 00010
L5 00000
즉, 좀 더 자세히 설명하자면 비트맵에서 1은 해당 위치의 record가 그 value를 가지고 있다는 뜻이고, 0은 value를 가지고 있지 않다는 뜻이다.
여기서 비트맵 인덱스의 특징이 나오는데, 비트맵 인덱스의 길이는 레코드의 개수와 동일하다. 위의 예시를 보면 쉽게 이해가 갈 것이라고 생각한다.
그럼 과연 이 bitmap index가 왜 여러 개의 search key으로 SQL 쿼리를 수행할 때 효율적이라고 하는 것 일까?
예를 들면 아래와 같은 쿼리가 있다고 생각해보자select * from example where gender = "m" and income_level = "L1";
이 쿼리를 실행할 때 비트맵 인덱스가 있다면
M 10010 와 L1 10100 을 단순히 곱하여서 10000을 도출하면 끝이기 때문이다.
즉, 0번째 record만 조건에 해당하는 record인 것이다.
따라서 bitmap index가 왜 여러 개의 search key으로 SQL 쿼리를 수행할 때 효율적이다.
더 생각해본다면 위와 같은 and 조건 말고 or 또는 not 조건에서도 마찬가지로 효율적이란 것을 알 수 있다.
Bitmap Index의 효율성
그럼 과연 Bitmap Index를 두는 것이 항상 효율적일까?
칼럼의 cardinality가 높다면 Bitmap Index를 두는 것이 효율적이지 않을 수 있다.
예를 들면, 주민등록번호나 핸드폰 번호 같이 unique한 컬럼의 경우에는 모든 값마다 bitmap index를 만들어야 하기 때문에 비효율적이다.
또한 delete가 많이 일어나는 경우에 비효율적이다.
왜냐하면 bitmap을 매번 0을 지워주고, 옮겨주고, 채워주는 과정이 비효율적이기 때문이다.
따라서 read-only한 환경일 경우에 효율적이다!
마지막으로 이러한 bitmap index를 Oracle 19c에서만 지원하고 있다.
더 알고 싶다면 아래 글을 참고하자!
https://durumiss.tistory.com/30MySQL, Oracle, PostreSQL 비교 분석하기
MySQL, Oracle, PostreSQL의 아키텍쳐 및 특징에 대해 발표한 내용 공유드립니다 MySQL 8.0, Oracle 19c, PostreSQL 15 버전으로 최대한 공식문서를 참고하여 조사하였습니다 잘못된 내용에 대한 지적은 언제나
durumiss.tistory.com
참고 :
Database System Concepts 7th edition'Computer Science > Database' 카테고리의 다른 글
[SQL Join 시리즈2] 데이터베이스 Hash Join (0) 2023.01.05 [SQL Join 시리즈1] 데이터베이스 Nested Loop Join (2) 2023.01.04 [인덱스 시리즈2] 데이터베이스 B+Tree Index (0) 2023.01.03 [인덱스 시리즈1] 데이터베이스 Hash Index(해시 인덱스) (2) 2023.01.03 MySQL, Oracle, PostreSQL 비교 분석하기 (0) 2022.12.21