TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-19 |
제목 | BITMAP INDEX 키 값의 내부 저장 방법 및 운영 TIPS | ||
---|---|---|---|
SCOPE
----- 8i~10g Standard Edition 에서는 Bitmap Index 를 지원하지 않는다. BITMAP INDEX 키 값의 내부 저장 방법 및 운영 TIPS =============================================== 데이터 웨어하우징과 같은 방대한 자료 값을 병렬로 수행하고자 하거나 AND/OR 연산을 효과적으로 지원하기 위해 필요한 기능 중에 하나가 bitmap 인덱스이다. 본 기술 자료에서는 간단한 bitmap 예제를 통하여 저장 방법과 운영에 필요한 특징을 소개한다. (1) 'M' 또는 'F' 값만을 갖는 GENDER 컬럼을 갖는 테이블 EMP를 생성한다. CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), GENDER CHAR(1), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)); INSERT INTO EMP VALUES (7369,'SMITH','M','CLERK',7902,'17-DEC-80',800,NULL,20); INSERT INTO EMP VALUES (7499,'ALLEN','M','SALESMAN',7698,'20-FEB-81',1600,300,30); INSERT INTO EMP VALUES (7521,'WARD','M','SALESMAN',7698,'22-FEB-81',1250,500,30); INSERT INTO EMP VALUES (7566,'JONES','F','MANAGER',7839,'2-APR-81',2975,NULL,20); INSERT INTO EMP VALUES (7654,'MARTIN','F','SALESMAN',7698,'28-SEP-81',1250,1400,30); INSERT INTO EMP VALUES (7698,'BLAKE','M','MANAGER',7839,'1-MAY-81',2850,NULL,30); INSERT INTO EMP VALUES (7782,'CLARK','M','MANAGER',7839,'9-JUN-81',2450,NULL,10); INSERT INTO EMP VALUES (7788,'SCOTT','F','ANALYST',7566,'09-DEC-82',3000,NULL,20); INSERT INTO EMP VALUES (7839,'KING','F','PRESIDENT',NULL,'17-NOV-81',5000,NULL,10); INSERT INTO EMP VALUES (7844,'TURNER','F','SALESMAN',7698,'8-SEP-81',1500,0,30); INSERT INTO EMP VALUES (7876,'ADAMS','M','CLERK',7788,'12-JAN-83',1100,NULL,20); INSERT INTO EMP VALUES (7900,'JAMES','F','CLERK',7698,'3-DEC-81',950,NULL,30); INSERT INTO EMP VALUES (7902,'FORD','M','ANALYST',7566,'3-DEC-81',3000,NULL,20); INSERT INTO EMP VALUES (7934,'MILLER','F','CLERK',7782,'23-JAN-82',1300,NULL,10); (2) GENDER 컬럼에 bitmap 인덱스를 생성한다. CREATE BITMAP INDEX EMP$GENDER$BMIDX ON EMP (GENDER); (3) 데이터 블럭에 저장되는 bitmap 인덱스 다음과 같은 성질을 갖는다. - Bitmap 인덱스 키 값은 8 개 단위의 그룹으로 ROWID 범위와 함께 인덱스 엔트리에 저장된다. 인덱스 생성 후 레코드 삽입 작업이 많으면 단편화가 심하게 발생할 수 있다. - 각각의 인덱스 키 값에 대하여 bitmap이 생성된다. 따라서 이 예제에서 'M'과 'F' 값에 대하여 두 개가 아래와 같은 개념으로 관리된다. 'M': 11100110001010 'F': 00011001110101 (두 bitmap의 XOR(Exclusive OR) 연산은 반드시 1의 결과값을 계산하여야 한다.) - 키 값의 bitmap은 압축된 형태로 저장된다. (4) 다음은 실제 블럭 덤프 출력을 통하여 저장 형태를 알아 본다. row#0[1866] flag: ----, lock: 0 col 0; len 1; (1): 46 col 1; len 6; (6): 01 00 00 0d 00 00 col 2; len 6; (6): 01 00 00 0d 00 0f col 3; len 3; (3): c9 98 2b row#1[1844] flag: ----, lock: 0 col 0; len 1; (1): 4d col 1; len 6; (6): 01 00 00 0d 00 00 col 2; len 6; (6): 01 00 00 0d 00 0f col 3; len 3; (3): c9 67 14 설명: col 0: key value (46은 'F'의 아스키 값, 4d은 'M'의 아스키 값) col 1: ROWID 범위의 시작 위치 (첫 4번째는 테이블 데이터 블럭의 DBA) col 2: ROWID 범위의 종료 위치 (첫 4번째는 테이블 데이터 블럭의 DBA) col 3: 압축된 형태의 bitmap 아래는 두 개의 블럭에 걸쳐 저장된 인덱스 엔트리의 덤프 예제이다. /* 첫 번째 블럭 */ row#0[1867] flag: ----, lock: 0 col 0; len 1; (1): 46 col 1; len 6; (6): 01 40 00 ad 00 00 col 2; len 6; (6): 01 40 00 ad 00 07 col 3; len 2; (2): c8 98 row#1[1846] flag: ----, lock: 0 col 0; len 1; (1): 4d col 1; len 6; (6): 01 40 00 ad 00 00 col 2; len 6; (6): 01 40 00 ad 00 07 col 3; len 2; (2): c8 67 /* 두 번째 블럭 */ row#0[1858] flag: ----, lock: 0 col 0; len 1; (1): 46 col 1; len 6; (6): 01 40 00 9e 00 00 col 2; len 6; (6): 01 40 00 9f 00 17 col 3; len 11; (11): cc 98 2b e6 8a 39 fa 0c c5 5c 01 row#1[1829] flag: ----, lock: 0 col 0; len 1; (1): 4d col 1; len 6; (6): 01 40 00 9e 00 00 col 2; len 6; (6): 01 40 00 9f 00 0f col 3; len 10; (10): cc 67 d4 19 75 46 f9 0c 3a a3 (5) 효과적으로 운용하기 위하여 알아야 할 사항 1. 하나의 키 컬럼에 두 개 이상의 인덱스 엔트리를 가질 수 있다. 2. Bitmap 인덱스를 ANALYZE 명령으로 수행하면 USER_INDEXES.NUM_ROWS 값은 실제 키의 갯수가 아닌 인덱스 엔트리의 갯수가 나타낸다. (Bug이 아님) 3. 만일 인덱스 엔트리에 속해있는 인덱스 키중 하나의 값만 수정중이더라도 해당 인덱스 엔트리 전체에 락이 발생하여, 엔트리 내 다른 값이 지정하는 레코드에 대한 수정이 불가능하게 된다. 따라서 모든 인덱스가 하나의 엔트리에 의하여 관리된다면 해당 베이스 테이블은 한 시점에 하나의 트랜잭션에 의해서만 수정될 수 있다. 4. 다음은 bitmap 인덱스와 관련된 초기화 파라메터들이다. CREATE_BITMAP_AREA_SIZE BITMAP_MERGE_AREA_SIZE B_TREE_BITMAP_PLANS V733_PLANS_ENABLED 따라서 bitmap 인덱스는 조회용 위주의 응용 프로그램에서 사용되어야 하며, DML 작업이 수행되었을 경우에는 지속적인 유지 관리가 필요하다. |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |