DBA_USERS                      : 데이터베이스 USER에 대한 정보를 보여준다
DBA_ROLES                      : ROLE에 대한 정보를 보여준다.
DBA_TAB_PRIVS                  : 테이블에 대한 권한이 설정된 정보를 보여 준다
DBA_SYS_PRIVS                  : SYSTEM 권한이 설정된 정보를 보여준다
DBA_ROLE_PRIVS                 : ROLE에 대한 권한이 설정된 정보를 보여 준다.
DBA_COL_PRIVS                  : 컬럼 단위로 권한이 설정된 정보를 보여준다.
DBA_SEGMENTS                   : 세그먼트(저장공간이 있는 오브젝트)에 대한 정보를 보여준다.
DBA_OBJECTS                    : 모든 오브젝트에 대한 정보를 보여준다.

ALLOBJECTS                    : 모든 오브젝트에 대한 정보를 보여준다.
DBA_TABLESPACES                : 테이블 스페이스에 대한 정보를 보여준다.
DBA_DATA_FILES                 : 테이블스페이스를 구성하고 있는 데이터 파일에 대한 정보를 보여준다.
DBA_FREE_SPACE                 : 아직 사용되지 않은 영역에 대한 정보를 보여준다.
DBA_EXTENTS                    : 할당된? EXTENT의 정보를 보여준다.
DBA_TS_QUOTAS                  : QUOTA가 설정된 정보를 보여준다
DBA_TABLES                     : 테이블에 대한 정보를 보여준다.
DBA_TAB_COLUMNS                : 테이블을 구성하는 컬럼에 대한 정보를 보여준다
DBA_TAB_COMMENTS               : 테이블의 설명에 대한 정보를 보여준다
DBA_PART_TABLES                : 파티션 테이블에 대한 정보를 보여준다.
DBA_PART_KEY_COLUMNS           : 파티션을 구성하는 기준 컬럼에 대한 정보를 보여준다
DBA_COL_COMMENTS               : 컬럼에 대한 설명에 대한 정보를 보여 준다
DBA_INDEXES                    : 인덱스에 대한 정보를 보여준다.
DBA_PART_INDEXES               : 파티션된 인덱스에 대한 정보를 보여준다
DBA_IND_COLUMNS                : 인덱스를 구성하는 컬럼에 대한 정보를 보여준다
DBA_CONSTRAINTS                : 테이블에 걸려있는 제약조건을 보여준다.
DBA_CONS_COLUMNS               : 제약조건을 구성하는 컬럼에 대한 조건을 보여준다.
DBA_VIEWS                      : VIEW를 정의한 정보를 보여준다.
DBA_SYNONYMS                   : 시노님에 대한 정보를 보여준다.
DBA_SEQUENCES                  : 시퀀스에 대한 정보를 보여준다.
DBA_DB_LINKS                   : DB 링크에 대한 정의를 보여준다
DBA_TRIGGERS                   : 트리거에 대한 정의를 보여준다.
DBA_TRIGGER_COLS               : 컬럼 단위로 작성된 트리거에 대한 정의를 보여준다.
DBA_ROLLBACK_SEGS              : 롤백세그먼트에 대한 정보를 보여 준다.
DBA_SOURCE                     : FUNCTION, PROCEDURE,PACKAGE를 구성하는 PL/SQL 소스코드를 보여준다


V$SESSION                      : 세션에 대한 전반적인 정보를 보여준다
V$SESSSTAT                     : 세션의 현황에 대한 통계정보를 보여준다
V$SESSION_WAIT                 : 세션의 WAITING 통계정보를 보여준다
V$SESSION_EVENT                : 세션의 현재 WATING EVENT를 보여준다
V$SESS_IO                      : 세션의 IO현황을 보여준다
V$STATNAME                     : SESSSTAT의 STATUS의 이름을 보여준다.
V$SYSTAT                       : 시스템 전반의 성능 통계 정보를 보여준다
V$SYSTEM_EVENT                 : 시스템의 WATING EVENT별 통계정보를 보여준다
V$LIBRARYCACHE                 : 라이브러리 캐쉬 사용 정보를 보여준다.
V$ROWCACHE                     : 데이터 딕셔너리의 사용정보를 보여준다
V$LATCH                        : LATCH에 대한 정보를 보여준다
V$LOCK                         : LOCK에 대한 정보를 보여준다
V$LOCKED_OBJECT                : LOCK이 걸린 오브젝트에 대한 정보를 보여준다
V$SQLAREA                      : SQLAREA에 대한 정보를 보여준다
V$WAITSTAT                     : 시스템의 현재 Waiting현황을 보여준다
V$SQL                          : Parse된 SQL문장을 보여줌
V$SQLTEXT                      : 라인별로 SQL문장을 보여줌
V$SQLTEXT_WITH_NEWLINES        : NewLine을 포함하여 SQL문장을 보여줌
V$SGA                          : SGA 의 정보를 보여준다
V$PARAMETER                    : InitSID.ora 등에서 설정된 파라메터, 즉 데이터베이스의 구동되었을 때의 환경 파라메터 정보이다
V$CONTROLFILE                  : Control 파일에 대한 정보를 보여준다.
V$DATAFILE                     : 데이터 파일에 대한 정보를 보여준다.
V$LOG, V$LOGFILE               : 리두 로그에 대한 정보를 보여준다.
V$TABLESPACE                   : 테이블 스페이스에 대한 정보를 보여준다.

'OraclE' 카테고리의 다른 글

Oracle Data Pump(Oracle 10g)  (0) 2008.10.01
ASSM에서 Freelist 관리  (0) 2008.09.25
오라클에서 시퀀스(SEQUENCE) 사용하기  (0) 2008.09.17
Windows 32bit OS 에서 Oracle Memory Sizing  (0) 2008.08.13
BITMAPPED INDEX  (0) 2008.08.12
오라클에서 시퀀스(sequence) 사용하는 방법을 알아보겠습니다.

오라클의 시퀀스는 MySql이나 MSSQL의 auto_incremet(자동증가)와 같은 것이라 생각하면 되겠습니다.

이것은 중복되지 않는 값을 주기 위해 사용하는데,,,

만약, 회원 1000명에게 회원번호를 부여해야 하는데 서로 중복되지 않는 값을 부여해야 할 경우,

처음 회원에게는 1번을, 그 다음회원에게는 2번을,,,, 1000번까지 각각 부여할 수 있을 겁니다.

즉, 지금까지 부여한 번호를 간직하고 있다가 다음 회원이 왔을 때 그 다음 번호를 부여하는 역할을 시퀀스라는 넘이 해줍니다.

 
 

시퀀스 테스트를 위해 임의의 테이블을 만들어 보겠습니다.

CREATE TABLE test (
            sq_id NUMBER
,            sq_name VARCHAR2(20)
);



 
이제 test라는 테이블에 시퀀스를 만들어 보겠습니다.
 

CREATE SEQUENCE sq_test
INCREMENT BY 1
START WITH 10000;



INCREMENT BY 1 : 자동 증가 칼럼의 증가치가 1이라는 뜻
START WITH 10000 : 자동 증가 칼럼이 10000부터 증가한다는 뜻


CREATE SEQUENCE 라는 문장을 사용하여 sq_test 이름의 시퀀스를 만들었습니다.

이제부터 sq_test를 사용하여 sq_id를 자동 증가 칼럼으로 사용할 수가 있습니다.

 

 
그럼, 데이터를 입력해서 확인해 보겠습니다.
 

INSERT INTO test(sq_id, sq_name) VALUES(sq_test.NEXTVAL, '이순신');


 
여기서, sq_id에 MYSQ.NEXTVAL이라는 데이터를 입력했는데, 시퀀스의 다음값을 가져오게 됩니다.
(시퀀스를 사용할 때 NEXTVAL이라는 슈도 칼럼(Pseudo-column)을 사용합니다.)

그럼, 실제로 sq_id에 값이 어떻게 들어갔는지 확인해 보겠습니다.
 

SELECT * FROM test;


SQ_ID            SQ_NAME
----------------------
10000            이순신



 
시퀀스 생성시에 START WITH 10000; 라고 했기 때문에 10000이라는 값이 들어갔습니다.

다시 한번 데이타를 입력해 보겠습니다.
 

INSERT INTO test(sq_id, sq_name) VALUES(sq_test.NEXTVAL, '홍길동');


SELECT * FROM test;


SQ_ID            SQ_NAME
----------------------
10000            이순신
10001            홍길동

 

 
10000 에서 1이 자동증가하여 10001이라는 값이 입력되었습니다.

이번엔,,, SQ_NAME이 '홍길동'인 로우를 지워보겠습니다.
 

DELETE FROM test WHERE sq_name = '홍길동';


SQ_ID            SQ_NAME
----------------------
10000            이순신

 

 
다시 새로운 데이터를 하나 넣겠습니다.
 

INSERT INTO test(sq_id, sq_name) VALUES(sq_test.NEXTVAL, '김철수');


SELECT * FROM test;


SQ_ID            SQ_NAME
----------------------
10000            이순신
10002            김철수


 

 
sq_id에 10001이 아니라 10002가 들어가 있습니다.

왜냐하면, 시퀀스는 그 특성상 일단 한번 증가하면 그 값이 절대 다시 줄어들지 않기 때문입니다.

이것은 mysql이나 mssql의 auto increment(자동증가)와도 동일합니다.
 


시퀀스를 생성할 때, 값의 범위를 지정할 수 있습니다.

CREATE SEQUENCE sq_test
INCREMENT BY 1
START WITH 100;
MINVALUE 1
MAXVALUE 1000



이렇게 시퀀스를 생성하면, 100부터 시작하고 값은 1~1000 사이의 값만 생성을 시킬 수 있습니다.


[출처] http://iurim.com/uboard.asp?id=webstudy_tip&cate_no=307&u_no=310&code=webstudy

'OraclE' 카테고리의 다른 글

ASSM에서 Freelist 관리  (0) 2008.09.25
DBA Table / View 정리  (0) 2008.09.17
Windows 32bit OS 에서 Oracle Memory Sizing  (0) 2008.08.13
BITMAPPED INDEX  (0) 2008.08.12
REVERSE KEY INDEX  (0) 2008.08.12
제품 : Database

작성날짜 : 2007-12-21

PURPOSE
-------

Windows 32bit OS 메모리 제약과 Oracle 에서 추가메모리 사용하도록 설정하는 방법을 설명한다.


CONTENTS
--------

1. Windows 32bit 메모리 확장 관련 용어들
2. Windows 32bit 메모리 확장 설정 방법
3. AWE_WINDOW_MEMORY 파라미터 산정
4. Windows 에서 Oracle 메모리 사용량 모니터링
5. Windows 에서 Oracle 메모리 사용량 줄이는 방법

EXPLANATIONS
------------

1. Windows 32bit 메모리 확장 관련 용어

- /3GB
Windows 32bit OS 에서 메모리 어드레싱은 4GB 까지 가능하고, 이 중 2GB 는 커널이 사용하고
나머지 2GB 가 사용자 프로세스에게 할당되는 최대 메모리 크기이다. Windows 2000 이상에서는
/3GB 옵션을 사용하여 커널에 1GB 만 할당하고 나머지 3GB 를 사용자 프로세스에게 할당하여
2GB 한계를 넘어 메모리를 확장하여 사용할 수 있다. OS 에서는 boot.ini에 /3GB 옵션 추가하고,
어플리케이션 실행파일 헤더에 IMAGE_FILE_LARGE_ADDRESS_AWARE bit 이 설정되어 있으면 된다.
Oracle 8.1.7 이상에서는 기본적으로 IMAGE_FILE_LARGE_ADDRESS_AWARE bit 설정되었으므로 3GB
사용가능하다. 참고로 Windows 64bit OS 는 한 프로세스당 어드레싱 가능한 메모리가 8TB 이므로
32bit 에서 사용하는 추가적인 옵션들이 필요없다.

- /PAE (Physical Address Extentions)
/3GB 옵션과 더불어 32bit 메모리 제약을 넘기위한 방법으로, 가상 메모리내에 포인터 테이블로
"별도 메모리 영역"을 매개함으로 프로세스가 사용할 수 있는 실제 메모리 크기를 확장한다.
예를들어 Oracle 은 가상 메모리 2GB 영역 (/3GB 사용하면 3GB) 내에 포인터 테이블(window)만
저장하고 실제 DB BUFFER CACHE 는 "별도 메모리 영역" 에 할당한 후, BUFFER CACHE 사용시
포인터 테이블을 매개하여 실제 BUFFER CACHE 영역 사용한다. 여기서 "별도 메모리 영역" 도
메모리를 사용하는 것이다.

- AWE (Address Windowing Extensions) & Oracle 구현방식
AWE 는 PAE 기능을 사용하도록 어플리케이션에 제공된 API 이다.
AWE API 를 사용한 오라클 버젼들은 아래와 같다.
* Oracle 8.1.6.x
* Oracle 8.1.7.x
* Oracle 9.2.x
* Oracle 10.1.x
* Oracle 10.2.x

주의! 9.1.0.x 는 AWE 지원안됨.

AWE 구현된 Oracle 버젼들은 3GB 이상의 SGA 사용할 수 있는데, 정확히 말하면 SGA 중 BUFFER CACHE
영역만 3GB 이상의 "별도 메모리 영역"에 지정할 수 있다. 오라클에서 AWE 를 사용하면 BUFFER CACHE
사용시 포인터 테이블과 실제 BUFFER CACHE 가 있는 별도 메모리 영역과의 mapping & unmapping
과정이 추가되므로 기본적인 처리보다 느릴 수 있지만, 적어도 IO 을 줄일 수 있기 때문에
IO 느린 시스템에서는 성능 향상을 기대할 수 있다.


2. Windows 32bit 메모리 확장 설정 방법

- boot.ini 에 /3GB /PAE option 을 추가
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /3GB /PAE

- 오라클 서비스 실행하는 OS USER 에 "Lock memory pages"의 권한 부여
. Start -> Programs -> Administrative Tools -> Local Security Policy
(on a Domain Controller, click on 'Domain Security Policy' instead of 'Local Security Policy')
. Double-click on the 'Lock Pages in memory' policy.
. Add the appropriate user and click 'Ok'.
. Restart the OracleService<SID>

- 포인터 테이블 (window) 크기 지정하는 AWE_WINDOW_MEMORY 를 레지스트리 추가
. HKEY_LOCAL_MACHINE => Software => Oracle => HomeX 에 AWE_WINDOW_MEMORY=1024000000 추가
주의! 여러 인스턴스라면 각 Home 에 추가

- init.ora 에 USE_INDIRECT_DATA_BUFFERS=TRUE 추가하고 DB_BLOCK_BUFFERS 로 BUFFER CACHE 크기 설정

주의! DB_CACHE_SIZE 로 BUFFER CACHE 지정하면 에러 발생한다.
ORA-00385: cannot enable Very Large Memory with new buffer cache parameters

- Oracle10g 에서는 SGA_TARGET=0 설정하여 Automatic Memory Management 를 disable 해야한다.


3. AWE_WINDOW_MEMORY 크기 계산 방법

(1) 기본값 : AWE_WINDOW_MEMORY = 1GB

/PAE /3GB 를 지정해도 아래 메모리들의 총합은 3GB 내에 들어와야한다.
- AWE_WINDOW_MEMORY
- BUFFER CACHE 제외한 SGA (shared_pool, large_pool, java_pool, log_buffers ...)
- Overhead for Oracle.exe DLLs (100MB 정도)
- Stack space per thread (1MB/thread)
- PGA and UGA

결국 BUFFER CACHE 최대 크기는 OS 메모리 - 4GB + AWE_WINDOW_MEMORY 로 산정된다.
(여기서 4GB는 Oracle이 사용하는 3GB와 OS에서 사용하는 1GB의 합. 결국 이 영역을 제외한 나머지 영역에 buffer cache를 지정하여 사용할 수 있다.)
예를들어 12GB RAM 시스템에서 최대 BUFFER CACHE 크기= (Total RAM - 4GB + AWE_WINDOW_MEMORY) = 12GB - 4GB + 1GB = 9GB 이다.

(2) 8.1.7 이하에서는 AWE_WINDOW_MEMORY 최소값 제한이 없었으나,
Oracle9i R2 부터 최소값보다 작게 설정하면 DB 기동시 에러들이 발생한다.

ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS 8) Not enough storage is available to process this command


AWE_WINDOW_MEMORY 최소값 계산 공식
----------------------------------
a. MIN(AWE_WINDOW_MEMORY)= (4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8
b. _DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL)
c. Max Buffer Pools = 8 (상수)
d. SETS_PER_POOL /* USE_INDIRECT_DATA_BUFFERS=TRUE 로 VLM ENABLED */
SETS_PER_POOL = 2*CPU_COUNT (if VLM is enabled)
SETS_PER_POOL = CPU Count/2 (if VLM is NOT enabled)

시나리오 #1:
----------------
# of CPU's = 8
DB_BLOCK_SIZE = 8192
Total RAM = 8GB

SETS_PER_POOL = 2 * CPU_COUNT = 16
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*16 = 128
MIN(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES) / 8
= (4096 * 8192 * 128) / 8 = 536870912 bytes = 512 MB


시나리오 #2:
---------------
# of CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB

SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256
MIN(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES) / 8
= ( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB

주의 !!!
1. ORA-27102 는 AWE_WINDOW_MEMORY 최소값 이하일때도 발생하지만, BUFFER CACHE 가
실제 메모리보다 크게 지정된 경우에도 발생한다.
2. ORA-27102 는 DB_BLOCK_BUFFER < AWE_WINDOW_MEMORY 일때도 발생한다.
3. AWE_WINDOW_MEMORY 설정값은 "계산된 최소값 + 10 MB (overhead)" 으로 설정해야한다.
4. Hyperthreading enabled 시스템의 경우 # of CPU's 를 두배로 계산해야한다.

4. Windows 에서 Oracle 메모리 사용량 모니터링
TASK MANAGER 에서 VM 값은 정확하지 않으므로 관리도구에서 별도 모니터링해야한다.
관리도구 => Perfomance 선택 => "추가" => 성능개체:Process, Count:Virtual Bytes, Instance:oracle.exe 선택


5. Windows 에서 Oracle 메모리 사용량 줄이는 방법

(1) Oracle 실행파일 스택 크기 조정
Thread 들이 미리 1MB 스택을 PGA 로 선점하고 필요하게 되면 더 확장해서 사용하는데
대부분들의 Thread 들은 초기 스택도 사용하지 않는 경우가 많다.
아래처럼 default=1 MB 를 500 KB로 줄일 수 있다.

. DB 내린 후 ORACLE_HOME/bin 에서 수행
C:\OH\bin> orastack oracle.exe 500000
C:\OH\bin> orastack tnslsnr.exe 500000
C:\OH\bin> orastack svrmgrl.exe 500000

(2) Shared Server (pre-Oracle9i 는 MTS 설정) 사용: 세션들이 메모리를 공유하므로 Oracle 프로세스 전체적인 메모리를 줄일 수 있다.


References
----------
Note 225349.1 - Implementing Address Windowing Extensions (AWE) or VLM on Windows Platforms
Note.205089.1 - Oracle and Hyperthreading

'OraclE' 카테고리의 다른 글

ASSM에서 Freelist 관리  (0) 2008.09.25
DBA Table / View 정리  (0) 2008.09.17
오라클에서 시퀀스(SEQUENCE) 사용하기  (0) 2008.09.17
BITMAPPED INDEX  (0) 2008.08.12
REVERSE KEY INDEX  (0) 2008.08.12
제품 : ORACLE SERVER

작성날짜 : 2004-08-13


SCOPE
-----
8~10g Standard Edition 에서는 지원 하지 않습니다.

<< Bitmapped Index >>

최근에 각광받고 있는 Datawarehousing환경 과 End-User-Computing환경등
에서 필요한 RDBMS의 첨단 Indexing Access기법으로 경쟁사에서는 Bitwised
Index를 발표하고 있습니다. 이 기법은 Oracle Server V7.3에서도 Bitmapped
Index라는
이름으로 발표될 예정이므로 이에 대한 정확한 이해를 위해 다음사항을 기술해
보았습니다.

1) Bitmapped Index란 ?
2) Bitmapped Index의 장단점 ?
3) Oracle's Bitmapped Index의 특성 ?

1. Bitmapped Index란 ?
RDBMS의 Table로부터 특정 자료의 검색을 위해 기존의 일반 RDBMS에서는
검색효율의 향상을 위해 B-Tree Index를 구현하여 사용하여 왔습니다.
그외에도 B-tree Cluster Index , Hash Cluster Index등을 이용하여 대
부분의 검색효율을 보장하여 왔지만 B-Tree Access를 위한 특성으로
인해 몇가지 어려움을 안고 있었습니다.

1) B-tree Index Access 방식을 위해선 실지 조건비교되는 Column값에
대한Table의 원시값을 Index에도 보관하고 있어야 함으로 인해 Index를 위한
실지 data의 중복 저장으로 저장공간의 낭비를 감수하여야 했으며, 특히
현실 상황에서 자주 사용케 되는 여러 컬럼의 Concatenated Index (결합
인덱스) 에서 자료량이 많은 Table에 대해서는 크나큰 부담이었습니다.

2) Index설정 Column값의 분포도(Unique성)가 넓은 Column에대한 (예:성별)
조건검색시에는 Index access를 했을때 보다 오히려 Full Table Scan방식이
오히려 빠른 성능을 보장하기 때문에 RDBMS의 Cost Based Optimizer는
Random access비용이 많이드는 Index access를 포기하고 빠른속도의 순차
Table Scan을 하여 높은 Hit Ratio를 보장하려 하는 경우를 우리는 흔히
보게됩니다.

3) End-User-Computing 환경에서 흔히 예상되는 복잡한 질의조건으로 인해
Optimizer가 최적 실행계획에서 Index를 포기하게되는 경우를 초래합니
다. (예: 복잡한 OR 연산자등)

이러한 상황을 해결하기 위한 새로운 Index Access 방법으로 Bitmapped Index가
새롭게 등장하게 되었습니다.

다음 상황을 통하여 구체적 설명을 제시합니다.
예) 한국오라클(주) 에서 관리하고 있는 고객정보 Table이 다음과 같이
정의 되어있다고 가정합시다.
------------------------------------------------
고객번호 혼인여부 성별 중요등급
------------------------------------------------
1001 결혼 여 하
1002 미혼 남 상
1003 재혼 남 중
------------------------------------------------

상기 Column들의 속성을 보면
고객번호는 유일한 값들이며 B-Tree Index로 탁월한 조회성능 보장.
혼인여부(3종류),성별(2종류),중요등급(3종류) 은 30 - 50%의 넓은
분포도를 갖는 값들로서 B-Tree Index사용시 효율성이 거의 없슴.
즉, B-Tree Index에서는 자료의 값에 따라 Sort하여 이분식(Binary)
가지치기(Leaf & Node) 구조를 유지하여, 조건에 들어오는 값에따라
검색자료 범위(Access Range)를 쪼개어 나가는데 반해, 저장되어 있
는 자료가 동종(같은값)이 많다면 해야할일(Access Range)이 줄지
않고 비용이 많이드는 Random Access(Index에서 Rowid를 가지고 실
Table Data를 찾을때)만 많아지고, Scan해야할 자료가지(Leaf) 수는
쉽게 줄지않게되어 B-Tree Index방식으로는 빠른 성능을 보장하기가
어렵습니다.

그렇다면 다음과 같이 분포도가 좋지않은 중요등급 Column을 몇개의
Bit들만 가지고 정보를 저장키로 하여봅니다.

----------------------------------------------------------
중요등급 = '상' 1 0 0 0 0 0
중요등급 = '중' 0 1 0 0 1 1
중요등급 = '하' 0 0 1 1 0 0
----------------------------------------------------------
*혼인여부(3종류),성별(2종류)도 같이 적용하였다고 가정.

이런 상황에서 아래의 SQL을 실행한다고 가정하여 봅니다.

Select count(*) from 고객정보
where 결혼여부 = '미혼'
and 중요도 in ('상','중');
("미혼자 인 고객중에 중요도가 '상' 이거나 '중'인 고객은 몇 ?")
이SQL을 실행하기 위한 Optimizer가 이러한 Operation을 다음과
같이 결정한다면 훨씬 빠른속도의 성능을 낼 수 있을 것 입니다.

혼인여부 = '미혼' AND (중요도 = '상' OR 중요도 = '중')
즉, '011001' AND ( '100000' OR '010011')
다시 풀어보면 '011001' AND '110011' 이고 결과는 '010001'이다.
Optimizer는 두개 컬럼의 논리연산결과가 '010001'인 Row들을 찾아
건수를 세면 될 것 입니다.

상기와 같이 논리연산과 Bit처리 방식은 Computer에게 훨씬 쉽게
처리할 수 있는 길을 만들어주게 되면서, 몇종류 안되는 값들과의
별도의 조그만 연결표(Bitmap)와 몇Bit만의 저장공간만을 가지고
Index 구성을 가능케 함으로써 공간의 절약효과도 상당할 것이다.
특히, Data warehousing, Decision Support System 에서와 같은
방대한 정보량에서 유용할 수 있습니다.


2. Bitmapped Index의 장단점 ?

Index를 사용하는데 있어서 우리는 몇가지의 고려사항을 검토해야 합니
다. 조회성능측면, 저장공간측면, 유지관리측면 정도를 고려할 수 있습
니다. 앞으로, 이러한 측면에서의 Bitmapped Index특성을 설명하기로
하겠습니다. 우선, Bitmapped Index의 장,단점을 간추려보면 다음과 같
습니다. 장점으로는 아주적은 Index저장공간을 사용하여 좋지않은 분포
도의 값을 갖는 다량의 자료를 빠른속도로 Access할 수 있다는 것과 복
잡다양한 조건에 대해 Index Access Path를 적용할 수 있다는 점이 있는
반면, 조건 유형이 Pattern Match형태가 자주 사용될시 효용성이 극소화
되며, B-Tree Index와 같이 모든 Query에 대해 Index Path로 사용될 수
없다는 단점이 있습니다. 한예로 Insert, Update, Delete와 같은 Query
에서는 무의미 합니다.
Bitmapped Index는 다음과 같은 측면에서 각각 유용한 이점이 있습니다.

조회성능측면
- 각각의 독립적인 Column들에 대하여 여러유형 (AND,OR...)의 조건절에
대해 Index가 사용 되어지게 하는 규칙이 불필요하다.(ad hoc query)
- 분포도가 나쁜 값에 대한 Index Access가 빠름.
- Index Column으로 추가 필요시 독립적으로 추가 및 적용 가능.
- 복잡하게 길어지는 조건절에서도 모두 유효하게 작동된다.
(복잡한 질의 및 ad hoc query에서 유용)
- 특히 다량의 자료에 대한 계 질의(aggregate query)에서 탁월.
(예:COUNT operator)
- 분포도가 좋은 (Unique성:값의종류가 많다) 값에대한 Index는 불리.

저장공간측면
- Index에 가지고 있어야 될 자료값 에대한 공간 절약.
. 하지만, Bitmapped Index로 적용하게될 Column의 특성상 실제 값의
Size도 크지않다 예를들어 '남' 과 '여'값의 겨우 2Byte 이하일 것
이다. 즉, Bitmapped Index적용 Column의 후보는 대개 5가지 정도
이내의 값을 갖는 경우가 되므로 실지 값의 Size도 작게됨.
고로, 이러한 측면에서의 저장공간 절약 측면 보다는 실제 현업상
요구되는 Index구성에서 예를 들면 더나은 이해가 될 것 입니다.
예) 기존에 고객정보 검색속도를 위해 Index1을 다음과 같이 구성
하였다고 가정 하겠습니다.
B-Tree Index1 = (혼인여부,성별,중요도)
이경우는 Where절에서 혼인여부가 조건에 오지않는 경우나
조건절에 성별만 혹은 중요도만을 가지고 검색할 경우에는
Index1을 사용할 수 없기에 Index2(성별,중요도,혼인여부),
Index3(중요도,성별,혼인여부)등의 추가 Index가 있어야
만족한 성능을 낼 수 있었다면 거의 10 - 100배의 공간절약
을하며 Bitmapped Index1(혼인여부),Index2(성별),Index3
(중요도)등의 독립적인 3개의 적은공간으로 만족한 성능을
보장할 수 있슴. 이러한 측면에서의 이점이 클 것 입니다.

유지관리측면
- Bitmapped Index는 Decision Support System과 같은 조회전용 업무나
OLTP업무 비중이 작은 업무에서 적합.
- 아직 Single Bit에 대한 Lock방안이 없고, Bitmapped Index에서는
Row-Level Locking대신에 Block-Level Locking이 적용되기 때문에
OLTP전용 업무에서는 Lock Contention 및 Deadlock 가능성 많음.
- Bitmapped Index에서 Update등의 Transaction은 Block level Lock을
사용하여야 하므로 Oracle의 기본Locking 인 Row level Lock 사용할
수 없게 되며 결국 Oracle block (예:2KB)내의 한Row에 대한 변경이
필요시(Update등)에는 해당 Block전체가 Locking되므로 잦은 변경이
예상되는 OLTP업무에서는 큰부담이 되므로 Batch성 Bulk Operation
이 가미되어 운용할 수 있는 방안이 필요.
예) Data warehousing에서는 주업무가 조회이며, 자료변경 추가시는
대부분 Batch성으로 처리하는 사례에서 Batch작업시 Bitmapped
Index들을 Disable시키고 처리후 Enable하는 것이 바람직.


3.Oracle's Bitmapped Index의 특성 ?
Oracle에서의 Bitmapped Index는 다음의 이점을 제공합니다.

검증된 기술
- 이미 Oracle7의 Text Server에서 Bitmapped Technology를 적용하여
사용하여 왔으며 이러한 기술을 Oracle7 Release7.3에서 Production
으로 제공합니다.

통합기능으로 제공
- 별도의 기능옵션 추가없이 Oracle Server에 통합되어 제공됩니다.
- 기존 사용 모든 환경과 수정없이 통합 적용이 가능합니다.
(예: DB Trigger, Distributed, Parallel, Integrity constraints...)
- 각종 SQL, Tool 및 Utility, Application등에서 수정이 필요없습니다.

병렬 Index 생성 지원
- 방대한 자료에 대한 Index생성시 병렬수행으로 Bitmapped Index생성

압축기능
- 저장공간을 현저히 줄일 수 있게 구현된 압축기법을 제공합니다.

입력/수정/삭제 지원
- Oracle의 Bitmapped Index는 Insert,Update,Delete 를 지원합니다.
(은행 계정업무 와 같은 무리한 OLTP transaction이 아닌 하루업무
중에 약 10% 이내의 자료변경 업무는 그대로 사용 가능)
- 사용자로 하여금 가끔 유발되는 변경에 대해서 Bitmapped Index를
재생성이 불필요하게 투명하게 사용가능.

병렬 Index 검색 지원
- 대량의 Table에 대한 검색시 병렬로 Bitmapped Index 검색 가능.
여러컬럼에 대한 Bitmapped Index 지원
- 분포도가 나쁜 몇개의 컬럼이 항시 같이 조건에 오는 경우 B-Tree
Index에서의 Concatenated Index같이 Multicolumn Bitmapped Index
사용가능.

유연성 보장
- 하나의 Table에 B-tree Index와 Bitmapped Index를 동시
혼용가능.
(Clustered Index도 혼용 생성 가능)

Oracle에서의 테스트 예제

Oracle에서의 Bitmapped Index의 특성을 확인할 수 있는 예시
입니다.

고객정보자료는 약100만건의 자료로 구성되어 있으며 현재 고객번호는
유일한 값으로 구성되며 Primary Key로 선언되어 있습니다.
그러나, 성별 과 중요도, 혼인여부 컬럼의 값은 2가지 내지는 3가지
종류이어서 B-Tree Index로는 검색수행 속도를 보장할 수 없는
상황임.

1) Select * from 고객정보 where 성별 = '남';
본 SQL을 Optimizer는 최적의 Execution Plan으로 Parallel
Full Table Scan을 선택하게 됩니다. (전체의 50%이므로)

2) Select * from 고객정보 where 고객번호 = 1001;
본 SQL을 Optimizer는 최적의 Execution Plan으로 Unique
B-tree Index를 Access 하여 Rowid를 가지고 Table 을
1번 Scan.

3) Select * from 고객정보
where 성별 = '남' and 중요도 in ('상','중');
본 SQL을 Optimizer는 최적의 Execution Plan으로 Bitmapped Index
를 선택하게 됩니다.

4) Select * from 고객정보
where 성별 = '남' and 고객번호 = 1001;
본 SQL을 Optimizer는 최적의 Execution Plan으로 B-tree Index를
Range Scan하는 방법을 선택하게 됩니다.
(성별 Bitmapped Index 보다는 Unique한 고객번호 Index가 효율적)

상기와같이 Oracle 에서의 Bitmapped Index는 Cost Based Optimizer
에 의해 투명하고 유연성있게 수행속도를 보장하게 되며, 필요시
Oracle의 특징인 Optimizer 취사 선택기능으로 사용의도에 맞추어
사용이 가능합니다.
결론

Data Warehousing 또는 Decision Support System에서의 필요한 요소인
Oracle의 Bitmapped Index는 Release7.3 Server에 탑재되게 되었으며
기존 RDBMS에서의 조회 수행속도의 몇가지 걸림돌을 해결케 하였고, 또
한 방대한 자료량에 대한 Index의 저장공간 절약 및 End-User-computing
에 꼭 필요한 Indexing 구현기법입니다.
단, Bitmapped Index만이 지상 최대의 해법이 아니란 것도 우리는 알아
야 하며 사전에 OLTP에서의 부담감에 대한 분석이 필요하며, 과연 나쁜
분포도에서 저장공간에 대한 낭비에는 많은 관심이 없고 단지 좋은 조회
속도를 보장키 위한다면 이미 기존 Oracle7에서부터 사용해온 Clustered
Index를 검토해 보는 것이 타당하리라고 사료됩니다.


Reference Documents
-------------------
<Note:70067.1>
<Note:108653.1>

'OraclE' 카테고리의 다른 글

ASSM에서 Freelist 관리  (0) 2008.09.25
DBA Table / View 정리  (0) 2008.09.17
오라클에서 시퀀스(SEQUENCE) 사용하기  (0) 2008.09.17
Windows 32bit OS 에서 Oracle Memory Sizing  (0) 2008.08.13
REVERSE KEY INDEX  (0) 2008.08.12

+ Recent posts