Bitmap index [오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]
비트맵 인덱스(Bitmap Index)
:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />:NAMESPACE PREFIX = O />
B*Tree 인덱스
- B-tree 인덱스는 실제 컬럼 값을 인덱스에도 보관함으로써 중복이 생긴다.
- B-tree 인덱스는 컬럼의 분포도가 좁아야 최적의 성능을 발휘 하므로 분포도가 넓을 경우 불리
- b-tree 인덱스는 'null', 'not'을 사용한 부정형 조건 복잡한 'or'등에서 제 성능을 발휘하지 못함
· 대량 데이터 환경, 복합인덱스의 경우 Index위한 데이터 중복저장으로 저장공간의 낭비
Bitmap 인덱스
· DB Index를 Bit 단위로 저장하여 B-Tree 인덱스 한계를 극복하여 대량의 자료 조회에 적합한 Index 유형
· DW와 같은 정보계 시스템에서 다량의 데이터를 조회하는 경우, 데이터의 존재 여부를 0,1로 표현하여 다량의 데이터를 빠르게 조회
· 컴퓨터에서 사용하는 최소단위인 비트를 이용, 컬럼 값을 저장하고 이를 이용 ROWID를 자동으로 생성하는 방법
· 분포도가 나쁜 컬럼 값에 대한 Index Access가 빠름, OR 질의에 용이함
· 빈번하게 Update되는 환경에는 Leaf Block 갱신으로 인해 부적합하다. 하나의 인덱스 엔트리를 수정하게 되면 그인덱스가 가리키는 모든 ROW에 락을 건다.
·
:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />:NAMESPACE PREFIX = V />
B-tree 인덱스의 리프블럭(leaf block)은 Index key value + rowid 로 구성이 되어 있지만, Bitmap Index는 Index key value + Start Rowid + End Rowid + Bitmap 엔트리로 구성되어 있다. 1개의 index값이 테이블상의 여러 개의 record를 표현하기 때문에 DML문을 사용할 경우 row level locking을 지원할 수 없다
Start rowid 와 End rowid 의 사이에 있는 모든 row수만큼 Bitmap이 표현되어야 하지만, 오라클에서는 내부적인 압축 알고리즘을 사용하여 Bitmap을 생성하기 때문에 모두 표현되지 않는 경우도 있다 |
[구조]
bitmap인덱스의 leaf block 구조는 key, start rowid, end rowed, bitmap으로 구성되어 있다. (비트리 인덱스의 경우 key, rowid로 구성) 비트맵 인덱스의 경우 하나의 인덱스 엔트리에 여러 개의 rowid가 있어 인덱스키와 rowid가 쌍으로 이루어진 B*Tree 인덱스와는 다르다.
[비트맵 인덱스 생성 절차]
인덱스를 생성하고자 하는 컬럼의 값들을 찾기 위해 테이블 스캔을 한 후
bitmap generator에 의해 컬럼값, start rowid, end rowid , bitmap을 갖는 인덱스 엔트리를 생성한다.생성된 Bitmap들을 B-tree구조에 넣기 쉽도록 key값과 start rowid 순으로 정렬하며 마지막 단계에서는 정렬된 인덱스 엔트리들을 단순히 B-tree구조로 삽입한다.
bitmap generator에 의해 컬럼값, start rowid, end rowid , bitmap을 갖는 인덱스 엔트리를 생성한다.생성된 Bitmap들을 B-tree구조에 넣기 쉽도록 key값과 start rowid 순으로 정렬하며 마지막 단계에서는 정렬된 인덱스 엔트리들을 단순히 B-tree구조로 삽입한다.
[실습]
SQL> create bitmap index idx_emp_job on emp(job);
인덱스가 생성되었습니다.
SQL> set autotrace on
SQL> select count(*) from emp
2 where job = 'SALESMAN';
COUNT(*)
----------
4
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU
------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 1 (0
| 1 | SORT AGGREGATE | | 1 | 8 |
| 2 | BITMAP CONVERSION COUNT | | 3 | 24 | 1 (0
|* 3 | BITMAP INDEX FAST FULL SCAN| IDX_EMP_JOB | | |
실행 계획을 보면 실제 데이터 테이블에는 접근하지 않았다.
아래의 예를 보자.
SQL> select empno, ename
2 from emp
3 where job = 'SALESMAN'
4 /
EMPNO ENAME
---------- ----------
7499 ALLEN
7521 WARD
7654 MARTIN
7844 TURNER
Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 54 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 3 | 54 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
이번에는 힌트 구문을 이용해 보자.(비트맵 인덱스를 사용하기 위해)
비트맵 인덱스를 이용하여 rowid를 찾았음을 알 수있다.
SQL> select
2 empno, ename
3 from emp
4 where job = 'SALESMAN'
5 /
EMPNO ENAME
---------- ----------
7499 ALLEN
7521 WARD
7654 MARTIN
7844 TURNER
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 54 | 2 (0)
| 1 | TABLE ACCESS BY INDEX ROWID | EMP | 3 | 54 | 2 (0)
| 2 | BITMAP CONVERSION TO ROWIDS| | | |
|* 3 | BITMAP INDEX SINGLE VALUE | IDX_EMP_JOB | | |
오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급
www.oraclejavacommunity.com
평일주간(9:30~18:20) 개강
(6/09)안드로이드개발자과정
(6/09)C#4.0,ADO.NET,Network 프로그래밍
(5/26)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(5/28)[교육전취업확정]Spring,MyBatis,XPlatform실무프로젝트과정
(5/30)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(5/30)[기업100%환급]SQL기초에서 Schema Object까지
(6/09)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
평일야간(19:00~21:50) 개강
(5/26)웹퍼블리싱 마스터
(5/28)Spring3.X, MyBatis, Hibernate실무과정
(5/28)SQL초보에서실전전문가까지
(5/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(6/03)안드로이드개발자과정
(6/10)C#4.0, ADO.NET, Network 프로그래밍
(6/19)C#,ASP.NET마스터
주말(10:00~17:50) 개강
(5/24)Spring3.X, MyBatis, Hibernate실무과정
(5/24)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(5/31)SQL초보에서실전전문가까지
(5/31)C#,ASP.NET마스터
(5/31)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(5/31)안드로이드개발자과정
주말저녁(18:30~22:20) 개강
www.oraclejavacommunity.com
평일주간(9:30~18:20) 개강
(6/09)안드로이드개발자과정
(6/09)C#4.0,ADO.NET,Network 프로그래밍
(5/26)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(5/28)[교육전취업확정]Spring,MyBatis,XPlatform실무프로젝트과정
(5/30)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(5/30)[기업100%환급]SQL기초에서 Schema Object까지
(6/09)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
평일야간(19:00~21:50) 개강
(5/26)웹퍼블리싱 마스터
(5/28)Spring3.X, MyBatis, Hibernate실무과정
(5/28)SQL초보에서실전전문가까지
(5/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(6/03)안드로이드개발자과정
(6/10)C#4.0, ADO.NET, Network 프로그래밍
(6/19)C#,ASP.NET마스터
주말(10:00~17:50) 개강
(5/24)Spring3.X, MyBatis, Hibernate실무과정
(5/24)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(5/31)SQL초보에서실전전문가까지
(5/31)C#,ASP.NET마스터
(5/31)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(5/31)안드로이드개발자과정
주말저녁(18:30~22:20) 개강
댓글 없음:
댓글 쓰기