2014년 5월 22일 목요일

Bitmap index [오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

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구조로 삽입한다.
 
[실습]
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 |       |       |
 

댓글 없음:

댓글 쓰기