Oracle

게시글 보기
작성자 유건데이타 등록일 2015-08-14
제목 인덱스 생성시에 COMPRESS OPTION
인덱스 생성시에 COMPRESS OPTION 을 사용할 수 있게 되었습니다.
이 COMPRESS OPTION 은 인덱스 키 컬럼의 중복을 방지해서 저장 공간의 낭비
를 막아 줍니다.

제한사항:
- COMPRESS INDEX는 B*TREE 인덱스와 IOT 에 대해서 적용 가능 합니다.
- COMPRESS INDEX는 NON-PARTITIONED INDEX 에 대해서만 적용 가능합니다.
- COMPRESS INDEX는 UNIQUE 인 경우에는 컬럼이 2개 이상 이어야 하며,
NON-UNIQUE 인 경우에는 1개의 컬럼에 대해서도 적용 가능 합니다.

인덱스 키에 대해 압축이 이루어지는 원리는 다음과 같습니다.

인덱스를 PREFIX 와 SUFFIX 두 부분으로 나누어 저장합니다. 이 때, PREFIX 의 길이
를 정수로 표시하고 이 길이는 압축될 PREFIX 컬럼의 갯수가 됩니다. 만일 COMPRESS
옵션을 줄때 범위를 명시하지 않으면, 마지막 컬럼을 제외한 모든 컬럼에 대해 압축
을 하게 됩니다.

PREFIX 대상으로 선택할 컬럼은 최대한 다음과 같이 할 수 있습니다:

- 인덱스가 NON-UNIQUE 인덱스라면 모든 컬럼을 대상으로
- 인덱스가 UNIQUE 인덱스라면 한 컬럼을 제외한 모든 컬럼

PREFIX 부분은 공통 부분으로 선택이 되며, SUFFIX 부분은 UNIQUE KEY 로 사용이
됩니다. 각각의 PREFIX 부분은 모든 SUFFIX 부분에 의해서 공유가 됩니다. 이는
각각의 저장 공간에 보다 많은 KEY 값을 저장한다는 것을 의미 하며 이는 압축을
하기 전보다 더 적은 블럭을 읽고도 INDEX RANGE SCAN 을 할 수 있도록 해줍니다.

이러한 KEY 압축은 블럭 단위로 이루어 지며 LEAF BLOCK 에 대해서만 이루어 집니다.
반면에 를 해석하기 위해서 인덱스 SCAN 자체의 성능은 약간 저하
될 수 있습니다.

예제
====

1. UNIQUE KEY 에 대한 INDEX 압축

샘플 테이블 생성

CREATE TABLE EMP
(EMPNO NUMBER UNIQUE,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER);

CREATE UNIQUE INDEX COMPRESS_UNIQUE_EMP ON EMP(ENAME, EMPNO)
COMPRESS 1;

COMPRESS_UNIQUE_EMP 인덱스에서 prefix part 는 ENAME KEY 입니다. 그리고 suffix
part 는 EMPNO 입니다. 각각의 블럭에서 ENAME은 EMPNO 항목에 의해서 공유 됩니다.
즉, 중복된 ENAME 은 한번만 저정한다는 의미 입니다.

2. NON-UNIQUE KEY 에 대한 INDEX 압축

NON-UNIQUE KEY 에 대한 INDEX 압축을 하면 오라클이 자동으로 row id 컬럼을 생성
합니다. 이 row id 컬럼이 바로 SUFFIX 부분이 되고 NON-UNIQUE 컬럼의 값이 PREFIX
부분이 됩니다.

다음 명령으로 NON-UNIQUE COMPRESS INDEX를 만들수 있습니다.

CREATE INDEX COMPRESS_NON_UNIQUE_EMP on EMP (DEPTNO) COMPRESS;

여기서는 DEPTNO 가 PREFIX 부분이 됩니다.

위에서 만든 인덱스에 대한 정보는 아래와 같습니다.

SQL> select index_name, uniqueness, compression from user_indexes;

INDEX_NAME UNIQUENES COMPRESS
------------------------------ --------- --------
COMPRESS_NON_UNIQUE_EMP NONUNIQUE ENABLED
COMPRESS_UNIQUE_EMP UNIQUE ENABLED
SYS_C001259 UNIQUE DISABLED

COMPRESS_NON_UNIQUE_EMP의 정보를 INDEX_STATS 에서 조회 할 수도 있습니다.

SQL> analyze index COMPRESS_NON_UNIQUE_EMP validate structure;

SQL> select * from index_stats
2 where name like '%NON_UNIQUE_EMP';

BLOCKS NAME PARTITION_NAME LF_ROWS
------ ------------------------- ------------------------------ ---------
LF_BLKS LF_ROWS_LEN LF_BLK_LEN BR_BLKS BR_ROWS_LEN BR_BLK_LEN DEL_LF_ROWS
-------- ----------- ---------- --------- ----------- ---------- -----------
DEL_LF_ROWS_ DISTINCT_KEYS MOST_REPEATED_KEY BTREE_SPACE USED_SPACE PCT_USED
------------ ------------- ----------------- ----------- ---------- --------
ROWS_PER_KEY BLKS_GETS_PER_ACCESS PRE_ROWS PRE_ROWS_LEN
------------ -------------------- --------- ------------
5 COMPRESS_NON_UNIQUE_EMP 39
1 429 1852 0 0 0 0
0 43 21 1852 429 24
,90697674 1,9534884 4 36

without compress option:

BLOCKS NAME PARTITION_NAME LF_ROWS
------ ------------------------- ------------------------------ ---------
LF_BLKS LF_ROWS_LEN LF_BLK_LEN BR_BLKS BR_ROWS_LEN BR_BLK_LEN DEL_LF_ROWS
-------- ----------- ---------- --------- ----------- --------- ----------
DEL_LF_ROWS_ DISTINCT_KEYS MOST_REPEATED_KEY BTREE_SPACE USED_SPACE PCT_USED
------------ ------------- ----------------- ----------- ---------- --------
ROWS_PER_KEY BLKS_GETS_PER_ACCESS PRE_ROWS PRE_ROWS_LEN
------------ -------------------- --------- ------------
5 NON_UNIQUE_EMP 39
1 546 1856 0 0 0 0
0 4 21 1856 546 30
9,75 6,375 0 0


위의 결과에 따르면 COMPRESS MODE의 USED_SPACE가 압축되지 않은 상태 보다 6% 정도
절약 됨을 알 수 있습니다. 또한 압축된 경우의 PREFIXED ROW 의 갯수(PRE_ROWS) 와 사용된 공간 (PRE_ROWS_LEN) 까지도 볼 수 있습니다.

3. 아래와 같이 COMPRESS 상태를 전환 할 수도 있습니다.

SQL> ALTER INDEX NON_UNIQUE_EMP REBUILD NOCOMPRESS;

4. Index Only Table 을 COMPRESS OPTION 을 사용해서 생성하는 예제

CREATE TABLE EMP_IOT
(EMPNO NUMBER UNIQUE,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER,
PRIMARY KEY (ENAME, EMPNO))
ORGANIZATION INDEX COMPRESS;

여기서는 첫번째 컬럼인 ENAME 이 PREFIX 부분으로 잡힙니다.
첫번째 컬럼이 PREFIX 부분으로 잡히는 것은 DEFAULT 입니다.

INDEX_NAME INDEX_TYPE COMPRESS PREFIX_LENGTH
------------------------- ----------------- -------- -------------
SYS_IOT_TOP_12299 IOT - TOP ENABLED 1

UNCOMPRESS 할 수 도 있습니다.

SQL> ALTER TABLE EMP_IOT MOVE NOCOMPRESS;

INDEX_NAME INDEX_TYPE COMPRESS PREFIX_LENGTH
------------------------- ----------------- -------- -------------
SYS_IOT_TOP_12299 IOT - TOP DISABLED

이상입니다.
Comment
등록된 코멘트가 없습니다.