- 카디널리티카 낮은 컬럼들 때문에 결합 인덱스를 만들어야..
- 조건과 인덱스 결합이 부합되지 않으면 비효율이 ..
- 이런 단점을 모두 해소할 수 있는 방법은 없을까?
BITMAP 인덱스
create bitmap index prod_color on prod(color);
create bitmap index prod_color on prod(color);
- ROWID 없음
- 어떤값을 갖든지 0 과 1로 표현
1) 구조
루트 블록과 브랜치 블록은 B-Tree 인덱스와 동일하나 리프 블록은 아래와 같이 비트맵으 로 구성
리프블록에는 각각의 컬럼값에 대한 비트들이 저장됨
2)특성
비트맵 인덱스에서 추출한 결과를 이용해 비트맵 연산을 통해 처리 할수 있음
리프블록에는 각각의 컬럼값에 대한 비트들이 저장됨
2)특성
비트맵 인덱스에서 추출한 결과를 이용해 비트맵 연산을 통해 처리 할수 있음
카디널리티가 높은 컬럼에 대해서는 비트맵 인덱스이 장점이 사라진다
선분형태로 저장되기 때문에 빈번한 수정이 발생하는 컬럼은 인덱스의 크기가 크게 증가 하고 블록레벨 잠금에는 적합하지 않은 경우가 많다.
NULL 값과 부정형은 존재하지 않기때문에 인덱스를 생성할수 없지만 bitmap 인덱스는 사용 가능
3)엑세스
select count(*) from parts where size='MED' and color='RED'
execution plan
0 select statement
1 0 sort (aggregate)
2 1 table access (by index rowid) of 'parts'
3 2 bitmap conversion (to rowids)
4 3 bitmap and
5 4 bitmap index (single value) of 'color_bix'
6 4 bitmap index (single value) of 'size_bix'
4) 엑세스 종류
각각의 비트맵을 추출하고 이들을 연산하여 머지를 한후 최종 결과를 rowid 로 변환하여 테이블 엑세스
부정형 조인의 경우 1차로 해당 조건의 비트맵에 대하여 MINUS 연산을 하고 다시 NULL 인 비트냅을 MINUS
bitmap conversion : bitmap <--> Rowid
bitmap index : bitmap 인덱스를 스캔
bitmap merge : Range Scan 으로 얻은 몇 개의 Bitmap 을 하나로 Merge
bitmap minus : 부정형 연산이다 차집합을 구할때
bitmap or :두개의 bitmap을 대상으로 bit 열에 대한 or 연산을 수행
bitmap and : 두개의 bitmap을 대상으로 bit 열에 대한 and 연산을 수행
bitmap key iteration : 한테이블에서 얻은 각각의 Row들을 특정 bitmap index 에 대해 연 속해서 탐침하여 해당하는 bitmap들을 찾는것
select * from table1 where col1=123 and col2 <> 'ABC' OR col3 < 100
1) col1 인덱스에서 123 인 비트맵을 엑세스 하고 col2 인덱스에서 abc 인 비트맵을 엑세스 하여 감산연산을 수행한다
2) 이 결과에 col2 가 null 인 비트맵을 엑세스 하여 다시 이 연산을 수행해야 한다
3) col3 < 100 인 조건은 범위 스캔이므로 이 범위의 비트맵을 익어 머지
4) 이제 2 와 3 에서 수행한 결과에 대해 bitmap or 연산을 수행하여 최종결과 비트맵을 만 들고, 이를 ROWID 로 변경하여 태이블에 엑세스 한다.
선분형태로 저장되기 때문에 빈번한 수정이 발생하는 컬럼은 인덱스의 크기가 크게 증가 하고 블록레벨 잠금에는 적합하지 않은 경우가 많다.
NULL 값과 부정형은 존재하지 않기때문에 인덱스를 생성할수 없지만 bitmap 인덱스는 사용 가능
3)엑세스
select count(*) from parts where size='MED' and color='RED'
execution plan
0 select statement
1 0 sort (aggregate)
2 1 table access (by index rowid) of 'parts'
3 2 bitmap conversion (to rowids)
4 3 bitmap and
5 4 bitmap index (single value) of 'color_bix'
6 4 bitmap index (single value) of 'size_bix'
4) 엑세스 종류
각각의 비트맵을 추출하고 이들을 연산하여 머지를 한후 최종 결과를 rowid 로 변환하여 테이블 엑세스
부정형 조인의 경우 1차로 해당 조건의 비트맵에 대하여 MINUS 연산을 하고 다시 NULL 인 비트냅을 MINUS
bitmap conversion : bitmap <--> Rowid
bitmap index : bitmap 인덱스를 스캔
bitmap merge : Range Scan 으로 얻은 몇 개의 Bitmap 을 하나로 Merge
bitmap minus : 부정형 연산이다 차집합을 구할때
bitmap or :두개의 bitmap을 대상으로 bit 열에 대한 or 연산을 수행
bitmap and : 두개의 bitmap을 대상으로 bit 열에 대한 and 연산을 수행
bitmap key iteration : 한테이블에서 얻은 각각의 Row들을 특정 bitmap index 에 대해 연 속해서 탐침하여 해당하는 bitmap들을 찾는것
select * from table1 where col1=123 and col2 <> 'ABC' OR col3 < 100
1) col1 인덱스에서 123 인 비트맵을 엑세스 하고 col2 인덱스에서 abc 인 비트맵을 엑세스 하여 감산연산을 수행한다
2) 이 결과에 col2 가 null 인 비트맵을 엑세스 하여 다시 이 연산을 수행해야 한다
3) col3 < 100 인 조건은 범위 스캔이므로 이 범위의 비트맵을 익어 머지
4) 이제 2 와 3 에서 수행한 결과에 대해 bitmap or 연산을 수행하여 최종결과 비트맵을 만 들고, 이를 ROWID 로 변경하여 태이블에 엑세스 한다.
댓글 없음:
댓글 쓰기