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
BITMAP INDEX SINGLE VALE SALES_CUST_JOB_BJIX <== BITMAP MERGE를 하지 않고 바로 BITMAP AND 를 수행
BITMAP MERGE
BITMAP KEY ITERATION
TABLE ACCESS (FULL) OF 'DEPT'
BITMAP INDEX (RANGE SCAN) OF 'SALES_DEPT_BX'
BITMAP MERGE
BITMAP KEY ITERATION
TABLE ACCESS (BY INDEX ROWID) OF 'CUSTOMERS'
INDEX ( RANGE SCAN) OF 'CUST_GRADE_IDX'
BITMAP CONVERSION ( FROM ROWIDS ) <=== 팩트 테이블에 비트맵 인덱스가 없으면 전화
INDEX ( RANGE SCAN) OF 'SALES_CUST_IDX'
조인은 집합의 연산에 의해 생성된 가공 집합이므로 제3의 집합이 나타날 수 있다.
그러므로 비트맵 조인 인덱스처럼 자신을 소유하는 직접적인 테이블이 필요할 때는
제약을 둘 수 밖에 없다. 이러한 이유 때문에 우리가 반드시 지켜야 하는 준수사항은
조인을 했을 때 인덱스를 생성하는 테이블이 반드시 '보존되어야(preserved)'
한다는 것이다.
조인을 하더라도 인덱스를 생성하는 집합이 그대로 보존되기 위해서는 다음 사항을
준수해야 한다.
\- 인덱스를 생성한느 테이블에 조인(참조)되는 테이블은 반드시 기본키 컬럼이거나
유일성 제약조건(Unique Constraints)을 가진 컬럼이 조인조건이 되어야 한다.
그것은 조인되는 집합의 유일설이 보장되지 않으면 그 결과는 보존될 수 없기 때문이다.
\- 참조되는 테이블의 조인 컬럼은 그 테이블의 기본키로 지정되어 있거나, 인덱스를
생성하는 테이블에서 외부키 제약조건이 선언되어 있어야 한다.
\- 만약 참조 테이블의 조인키가 결합 인덱스로 구성되었다면 모든 컬럼이 조인에
존재해야 한다.
\- 조인 조건은 반드시 이퀄(=)이어야 하며, 아웃터 조인을 사용할 수 없다.
\- 인덱스 일체형 테이블이나, 임시 테이블과는 비트맵 조인 인덱스를 생성할 수 없다.
\- 인덱스를 생성하는 조인 문에 집합을 처리하는 연산(Union, Minus 등), DISTINC,SUM
,AVG, COUNT 등의 집계 함수, 분석함수(Analytic Function), GROUP BY, ORDER BY,
CONNECT BY, START WITH 절을 상요해서는 안된다.
\- 인덱스 컬럼은 반드시 조인되는 테이블에 소속된 컬럼이어야 한다.
\- 비트맵 조인 인덱스는 비트맵 인덱스의 일종이므로 당연히 일반적인 비트맵 인덱스의
각종 규칙을 그대로 준수해야 한다. 가령, 유일성을 가진 컬럼은 비트맵 인덱스를 생성
할 수 없다.
이렇게 생성된 비트냅 조인 인덱스는 다음과 같은 사용상의 제약 사항을 가진다.
\- 병렬 DML 처리는 비트맵 조인 인덱스를 가지고 있는 테이블에서만 지원된다.
만약 관련됨 참조 테이블에서 병렬 DML 을 수행시키면 비트맵 조인 인덱스는
'UNUSABLE' 상태가 된다.
\- 비트맵 조인 인덱스를 사용하게 되면, 어떤 트랜잭션에서 동시에 오직 하나의 테이블만
처리 해야 한다. 조인된 테이블이 COMMIT 되지 않은 상태에서 동시에 변경되면 일관성을
보장할 수 없기 때문이다.
\- 조인 문장에서 동일한 테이블이 두 번 등장할 수 없다.
다음과 같은 비트맵 조인 인덱스를 생성도 가능하다.
CREATE BITMAP INDEX sales_cust_job_bix
ON sales ( cu.cust_job, p.product_tyep, c.continent )
FROM sales s, customers cu, products p, country c
WHERE s.cust_id = cu.cust_id
AND s.product_cd = p.product_cd
AND s.country_cd = c.country_cd
LOCAL NOLOGGING COMPUTE STATISTICS ;