새로쓴 대용량 데이터베이스솔루션 1 (2008년)
비트맵 조인 인덱스(Bitmap join index) 0 0 5,260

by 구루비 Bitmap join index 비트맵 조인 인덱스 [2009.05.17]


2.3.8. 비트맵 조인 인덱스(Bitmap join index)

Bitmap Join Indexes (BJI) is new functionality provided by Oracle9i.
A Bitmap Join Index prestores the results of a join and thus can avoid a
join operation altogether at runtime.

Bitmap Join Indexes are especially useful in datawarehouse star schemas.
When a column in a dimension table is used to restrict the data
selected from a fact table (with Foreign Keys) and n dimension tables
(with Primary Keys), a Bitmap Join Index can avoid a join operation between
these tables.

다음과 같이 비트맵 조인인덱스를 생성해보자.

CREATE BITMAP INDEX sales_cust_jos_bix
ON     sales (customers.cust_job)
FROM   sales, customers
WEHRE  sales.cust_id = customers.cust_id
LOCAL  NOLOGGING COMPUTE STATISTICS ;

이렇게 생성된 조인인덱스는 이제 CUSTOMERS 디멘전 테이블에 있던 'cust_job' 이
마치 SALES 팩트 테이블이 컬럼처럼 인식된다. 이처럼 비트맵 조인인덱스로 구성된
디멘전에 스타변형이 발생하면 아래와 같은 실행계획이 나타난다.

SELECT STATEMENT
 SORT GROUP BY
  HASH JOIN
   TABLE ACCESS FULL CHANNELS
    ................
     TABLE ACCESS BY LOCAL INDEX ROWID SALES
      BITMAP CONVERSION TO ROWIDS
       BITMAP AND
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX SINGLE VALE SALES_CUST_JOB_BJIX <== BITMAP MERGE를 하지 않고 바로 BITMAP AND 를 수행
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP MERGE
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP KEY ITERATION
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF 'DEPT'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (RANGE SCAN) OF 'SALES_DEPT_BX'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP MERGE
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP KEY ITERATION
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF 'CUSTOMERS'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX ( RANGE SCAN) OF 'CUST_GRADE_IDX'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION ( FROM ROWIDS ) <=== 팩트 테이블에 비트맵 인덱스가 없으면 전화
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX ( RANGE SCAN) OF 'SALES_CUST_IDX'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

조인은 집합의 연산에 의해 생성된 가공 집합이므로 제3의 집합이 나타날 수 있다.
그러므로 비트맵 조인 인덱스처럼 자신을 소유하는 직접적인 테이블이 필요할 때는
제약을 둘 수 밖에 없다. 이러한 이유 때문에 우리가 반드시 지켜야 하는 준수사항은
조인을 했을 때 인덱스를 생성하는 테이블이 반드시 '보존되어야(preserved)'
한다는 것이다.
조인을 하더라도 인덱스를 생성하는 집합이 그대로 보존되기 위해서는 다음 사항을
준수해야 한다.
\- 인덱스를 생성한느 테이블에 조인(참조)되는 테이블은 반드시 기본키 컬럼이거나
유일성 제약조건(Unique Constraints)을 가진 컬럼이 조인조건이 되어야 한다.
그것은 조인되는 집합의 유일설이 보장되지 않으면 그 결과는 보존될 수 없기 때문이다.
\- 참조되는 테이블의 조인 컬럼은 그 테이블의 기본키로 지정되어 있거나, 인덱스를
생성하는 테이블에서 외부키 제약조건이 선언되어 있어야 한다.
\- 만약 참조 테이블의 조인키가 결합 인덱스로 구성되었다면 모든 컬럼이 조인에
존재해야 한다.
\- 조인 조건은 반드시 이퀄(=)이어야 하며, 아웃터 조인을 사용할 수 없다.
\- 인덱스 일체형 테이블이나, 임시 테이블과는 비트맵 조인 인덱스를 생성할 수 없다.
\- 인덱스를 생성하는 조인 문에 집합을 처리하는 연산(Union, Minus 등), DISTINC,SUM
,AVG, COUNT 등의 집계 함수, 분석함수(Analytic Function), GROUP BY, ORDER BY,
CONNECT BY, START WITH 절을 상요해서는 안된다.
\- 인덱스 컬럼은 반드시 조인되는 테이블에 소속된 컬럼이어야 한다.
\- 비트맵 조인 인덱스는 비트맵 인덱스의 일종이므로 당연히 일반적인 비트맵 인덱스의
각종 규칙을 그대로 준수해야 한다. 가령, 유일성을 가진 컬럼은 비트맵 인덱스를 생성
할 수 없다.

이렇게 생성된 비트냅 조인 인덱스는 다음과 같은 사용상의 제약 사항을 가진다.
\- 병렬 DML 처리는 비트맵 조인 인덱스를 가지고 있는 테이블에서만 지원된다.
&nbsp; 만약 관련됨 참조 테이블에서 병렬 DML 을 수행시키면 비트맵 조인 인덱스는
&nbsp; 'UNUSABLE' 상태가 된다.
\- 비트맵 조인 인덱스를 사용하게 되면, 어떤 트랜잭션에서 동시에 오직 하나의 테이블만
&nbsp; 처리 해야 한다. 조인된 테이블이 COMMIT 되지 않은 상태에서 동시에 변경되면 일관성을
&nbsp; 보장할 수 없기 때문이다.
\- 조인 문장에서 동일한 테이블이 두 번 등장할 수 없다.

다음과 같은 비트맵 조인 인덱스를 생성도 가능하다.

CREATE BITMAP INDEX sales_cust_job_bix
ON&nbsp;&nbsp;&nbsp;&nbsp; sales ( cu.cust_job, p.product_tyep, c.continent )
FROM&nbsp;&nbsp; sales s, customers cu, products p, country c
WHERE&nbsp; s.cust_id = cu.cust_id
AND&nbsp;&nbsp;&nbsp; s.product_cd = p.product_cd
AND&nbsp;&nbsp;&nbsp; s.country_cd = c.country_cd
LOCAL&nbsp; NOLOGGING COMPUTE STATISTICS ;

문서에 대하여

  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 이화식님의 새로쓴 대용량 데이터베이스 솔루션을 참고했습니다.*
  • 이 문서를 다른 블로그나 홈페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^
"구루비 데이터베이스 스터디모임" 에서 2008년에 "새로쓴 대용량 데이터베이스 솔루션1" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/2597

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입