인덱스 종류
B-star Tree 인덱스
비트맵 인덱스
DISTINCT VALUE 개수가 적을 때 저장 효율이 매우 좋다.
- 카디널리티(NDV)가 낮은 컬럼
- ex) 성별, 지역코드, 상태코드 등
이런 컬럼이라면 B* Tree 인덱스보다 훨씬 적은 용량을 차지한다 인덱스가 여러개 필요한 대용량 테이블에 유용
다양한 분석관점 (Dimension) 을 가진 팩트 (Fact) 테이블이 여기에 속한다
여러 인덱스를 동시에 사용할 수 있다
- 여러개의 비트맵 인덱스로 Bitwise 연산을 수행하여 테이블 액세스량을 크게 줄일 수 있다면 극적인 성능 향상을 가져온다.
- 여러 조건을 조합한 임의 질의(ad-hoc query) 에서 비트 연산으로 빠르게 처리할 수 있어 성능 향상이 크다.
- 특히 대용량 데이터웨어하우스/OLAP 환경에서 유용하다.
다만 비트맵 인덱스는 DML(INSERT/UPDATE/DELETE) 부하가 크다,
- 레코드 하나만 변경되어도 해당 비트맵 범위에 속한 모든 레코드에에 락(lock)이 걸린다.
- 동시성이 중요한 OLTP 환경에는 부적합한 것이 단점이다.
함수기반(Function-Based) 인덱스
인덱스에도 함수를 적용한 상태로 값을 저장한 것
- 조건절에서 인덱스 컬럼에 함수를 적용하면 일반적으로 정상적인 Index Range Scan이 불가능하다.
- 인덱스는 “가공되지 않은 원본 값” 기준으로 정렬·저장되어 있는데, 가공한 값으로 검색하면 스캔 시작점/끝지점(범위)을 수직 탐색으로 결정할 수 없기 때문이다.
- 함수가 적용된 형태 그대로 값을 저장해 Range Scan이 가능하도록 만든 것이 함수 기반 인덱스(Function-Based Index)
- ex)
CREATE INDEX 고객_FBI1 ON 고객 ( REPLACE(전화번호, '-', '') );
리버스키 (Reverse Key) 인덱스
- 변경일시, 일련번호처럼 값이 지속적으로 증가하는 컬럼에 대해 다수 트랜잭션이 동시에 INSERT를 수행하면 인덱스 맨 오른쪽(마지막) 리프 블록에 경합이 집중될 수 있다.
- = Right Growing / Right-Hand Index
- 이를 완화하기 위해 인덱스 키 값을 뒤집어 저장하는 Reverse Key 인덱스를 사용한다.
- 키 값이 뒤집히면 삽입 위치가 여러 리프 블록에 분산되어 리프 블록 경합이 감소한다.
- ex)
CREATE INDEX HOT_TABLE_R1 ON HOT_TABLE ( RIGHT_GROWING_COL ) REVERSE; - 함수 기반 인덱스로도 비슷한 효과를 낼 수 있으나, 그 경우 SQL 조건절도 REVERSE() 형태로 맞춰줘야 한다.