TECH
QUESTION
자주하는 질문답변 입니다.
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 에 대해서만 이루어 집니다. 반면에 될 수 있습니다. 예제 ==== 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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |