비트맵 인덱스
- 비트맵 인덱스는 키 값에 중복이 없고, 키 값별로 하나의 비트맵 레코드를 갖는다.
비트맵 상의 각 비트가 하나의 테이블 레코드와 매핑된다.
비트가 1로 설정돼 있으면 상응하는 테이블 레코드가 해당 키 값을 포함하고 있음을 의미한다.
- 비트맵 인덱스는 첫 번째오 마지막 비트의 rowid만을 갖고 있다가
테이블 엑세스가 필요할 때면 각 비트가 첫 번째 비트로부터 떨어져 있는 상대적인 거리를
이용해 rowid 값을 환산한다.
비트맵 위치와 rowid 매핑
- 오라클은 한 블록에 저장할 수 있는 최대 레코드 개수를 제한하고 이 특징을 이용해
비트맵 위치와 rowid를 매핑한다.
키 값의 수가 많을 때
- 비트맵 인덱스는 키 값별로 하나의 레코드를 갖는데, 저장할 키 값의 수가 아주 많을 때는
한 블록에 모두 담지 못한다. 비트맵을 저장하기 위해 두 개 이상 블록이 필요해지면
비트리 인덱스 구조를 사용하며, 값의 수가 많을 수록 인덱스 높이도 증가한다.
- 이런 구조라면 비트리 인덱스보다 더 많은 공간을 차지할 수 있어 비트맵 인덱스로 부적합
키 값별로 로우 수가 많을 때
- 한 블록에 적어도 2개의 비트맵 레코드가 담기도록 잘라서 저장한다.
비트맵 압축
- 실제로는 여러 가지 압축 알고리즘이 사용되기 때문에 서로 다른 rowid 범위를 갖는다.
- 완전히 0으로 채워진 비트맵 블록들을 제거하고, 비트맵 뒤쪽에 0이 반복되어도 이를 제거
앞, 뒤, 중간 어디든 같은 비트맵 문자열이 반복되면 checksum 비트를 두어 압축한다.
- 이 때문에 각 비트맵이 가리키는 rowid 구간이 서로 달라지지만 시작 rowid와 종료 rowid만
알고 있으면 비트와 매핑되는 rowid를 계산하거나 다른 비트맵 과 Bitwise 연산하는 데에는
전혀 지장이 없다.
비트맵 인덱스 활용
- Distinct value 개수가 적을 때 저장효율이 좋다. 그런 컬럼이라면 비트리 인덱스보다 훨씬
적은 용량을 차지하므로 인덱스가 여러 개 필요한 대용량 테이블에 유용하다.
주로 다양한 분석관점을 가진 팩트성 테이블이 여기에 속한다.
(반대로 distinct value가 아주 많은 컬럼이면 오히려 비트리 인덱스보다 많은 공간을 차지한다.)
- Distinct Value 개수가 적은 컬럼일때 저장효율이 좋지만 테이블 Random 엑세스 발생 측면
에서는 비트리 인덱스와 똑같기 때문에 그런 컬럼을 비트맵 인덱스로 검새하면 그다지 좋은
성능을 기대하기 어렵다. 스캔할 블록이 줄어드는 정도의 성능 이점만 얻을 수 있다.
- 하나의 비트맵 인덱스 단독으로는 쓰임새가 별로 없지만 여러 비트맵 인덱스를 동시에
사용할 수 있다느 특징 때문에 대용량 데이터 검색 성능을 향상시키는 데에 큰 효과를 발휘
- 비트맵 인덱스를 이용하면 null 값에 대한 검색도 가능하다.
- 비트맵 인덱스는 여러 인덱스를 동시에 활용할 수 있다는 장점 때문에 다양한 조건절이
사용되는, 특히 정형화되지 않은 임의 질의가 많은 환경에 적합하다.
- 다만, 비트맵 인덱스는 lock에 의한 DML 부하가 심한 것이 단점이다.
레코드 하나만 변경되더라도 해당 비트맵 범위에 속한 모든 레코드에 lock이 걸린다.
(이래서 OLTP 성 환경에서 비트맵 인덱스를 사용하기 힘들다.)
- 이러한 특징으로 비트맵 인덱스는 읽기 위주로 대용량 환경에 적합하다.
'ORACLE > SQLP' 카테고리의 다른 글
성능고도화 2-2. 소트머지 조인 (0) | 2016.12.26 |
---|---|
성능고도화 2-1. Nested Loops 조인 (0) | 2016.12.26 |
성능고도화 1-8. 인덱스 설계 (0) | 2016.12.26 |
성능고도화 1-7. 인덱스 스캔 효율 (0) | 2016.12.26 |
성능고도화 1-6 IOT 클러스터 테이블 활용 (0) | 2016.12.26 |