Key Compressed Indexes

개요

  • 특징
    1. 테이블이 빈번하게 수정되는 시스템, read-only 또는 semi read-only 시스템에서도 동작
    2. 대용량 데이터에 compress index를 사용하면 좋다. 그러나, 트랜잭션이 조금만 증가해도 안되고 오히려 실제 운영하면 느릴 수 있다.
    3. Oracle 8i N.F.
    4. 인덱스 생성시에 COMPRESS OPTION 사용 가능
    5. COMPRESS OPTION : 인덱스 키 컬럼의 중복을 방지해서 저장 공간의 낭비를 막아줌



  • 제약 사항
    1. B*TREE 인덱스와 IOT 에 대해서 적용 가능
    2. NON-PARTITIONED INDEX 에 대해서만 적용 가능
    3. UNIQUE : 컬럼이 2개 이상 적용 가능
    4. NON-UNIQUE : 1개의 컬럼에 대해서도 적용 가능



  • 원리
    • 인덱스 구조 : nocompress Non-Unique index on a que_form_name column




    • Before compress




    • After compressed : 인덱스를 PREFIX 와 SUFFIX 두 부분으로 나누어 저장




    • PREFIX : 정수로 길이 표시. 압축될 PREFIX 컬럼의 갯수임
      {tip:title=Prefix}
  • prefix : 공통 부분으로 모든 SUFFIX 부분에 의해서 공유 = 각각의 저장 공간에 보다 많은 KEY 값을 저장
    (on) 압축을 하기 전보다 더 적은 블럭을 읽고도 INDEX RANGE SCAN 가능
  • PREFIX 대상 기준
    1. NON-UNIQUE 인덱스 : 모든 컬럼이 대상
    2. UNIQUE 인덱스 : 한 컬럼을 제외한 모든 컬럼
          cf) SUFFIX : UNIQUE KEY로 사용
  • KEY 압축
    • 블럭 단위로 수행
    • 대상 : LEAF BLOCK
  • 단점 : <PREFIX, SUFFIX> 를 해석하기 위해서 인덱스 SCAN 자체의 성능은 약간 저하 됨
    {tip}
    • COMPRESS 옵션을 줄때 범위를 명시하지 않으면, 마지막 컬럼을 제외한 모든 컬럼에 대해 압축 수행



  • 테스트
    1. UNIQUE KEY 에 대한 INDEX 압축
      1. COMPRESS_UNIQUE_EMP 인덱스
        1. prefix part = ENAME KEY
        2. suffix part = EMPNO
        3. 각각의 블럭에서 ENAME은 EMPNO 항목에 의해서 공유 됨(즉, 중복된 ENAME 은 한번만 저정)
      2. 샘플 테이블 생성 및 인덱스 생성

CREATE TABLE emp_compress
(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_compress(ENAME, EMPNO)
COMPRESS 1;





-# NON-UNIQUE KEY 에 대한 INDEX 압축
-## 오라클이 자동으로 row id 컬럼을 생성
-## 생성된 row id 컬럼 = SUFFIX 부분
-## NON-UNIQUE 컬럼 = PREFIX 부분 = DEPTNO
-## NON-UNIQUE COMPRESS INDEX 생성


CREATE INDEX COMPRESS_NON_UNIQUE_EMP on EMP_compress(DEPTNO) COMPRESS;





-# 인덱스 정보 확인


SQL> select index_name, uniqueness, compression from user_indexes;

INDEX_NAMEUNIQUENESSCOMPRESSION
SYS_C005707UNIQUEDISABLED
BIG_TABLE_PKUNIQUEDISABLED
BIG_TABLE_OWNER_IDXNONUNIQUEDISABLED
PK_EMPUNIQUEDISABLED
{*}COMPRESS_UNIQUE_EMP{*}{*}UNIQUE{*}{*}ENABLED{*}
{*}COMPRESS_NON_UNIQUE_EMP{*}{*}NONUNIQUE{*}{*}ENABLED{*}
PK_DEPTUNIQUEDISABLED

SQL> analyze index COMPRESS_NON_UNIQUE_EMP validate structure;
SQL> select * from index_stats where name like '%NON_UNIQUE_EMP';
SQL> analyze index COMPRESS_NON_UNIQUE_EMP validate structure;
SQL> select * from index_stats where name like '%UNIQUE_EMP';




-# COMPRESS 상태 전환


SQL> ALTER INDEX COMPRESS_NON_UNIQUE_EMP REBUILD NOCOMPRESS;

SQL> ALTER INDEX COMPRESS_UNIQUE_EMP REBUILD NOCOMPRESS;

SQL> select index_name, uniqueness, compression from user_indexes;

INDEX_NAMEUNIQUENESSCOMPRESSION
SYS_C005707UNIQUEDISABLED
BIG_TABLE_PKUNIQUEDISABLED
BIG_TABLE_OWNER_IDXNONUNIQUEDISABLED
PK_EMPUNIQUEDISABLED
{*}COMPRESS_UNIQUE_EMP{*}{*}UNIQUE{*}{*}DISABLED{*}
{*}COMPRESS_NON_UNIQUE_EMP{*}{*}NONUNIQUE{*}{*}DISABLED{*}
PK_DEPTUNIQUEDISABLED

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

-## user_indexes 조회 결과

OPTIONCompress = EnableCompress = EnableCompress = DisableCompress = Disable
{*}NAME{*}COMPRESS_NON_UNIQUE_EMPCOMPRESS_UNIQUE_EMPCOMPRESS_NON_UNIQUE_EMPCOMPRESS_UNIQUE_EMP
{*}USED_SPACE{*}{*}181{*}{*}363{*}{*}196{*}{*}279{*}
{*}PRE_ROWS{*}31400
{*}PRE_ROWS_LEN{*}2716800
{*}ROWS_PER_KEY{*}4.66714.6671
{*}PCT_USED{*}3534
{*}BTREE_SPACE{*}7992799279967996
{*}USED_SPACE_Ratio{*}2.264.542.453.49
{*}LF_ROWS{*}14141414
{*}LF_ROWS_LEN{*}154195196279
{*}BR_ROWS{*}0000
{*}BR_ROWS_LEN{*}0000
{*}DEL_LF_ROWS{*}0000
{*}DEL_LF_ROWS_LEN{*}0000
{*}DISTINCT_KEYS{*}314314
{*}OPT_CMPR_PCTSAVE{*}02370
  • COMPRESS MODE의 USED_SPACE가 압축되지 않은 상태 보다 6% 정도 절약
  • PRE_ROWS : 압축된 경우 PREFIXED ROW 의 갯수
  • PRE_ROWS_LEN : 사용된 공간




-# Index Only Table 을 COMPRESS OPTION 을 사용해서 생성하는 예제
--# IOT 테이블 생성


CREATE TABLE EMP_COM_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;

---# PREFIX 부분 : ENAME(첫 번째 컬럼)
---# DEFAULT : 첫번째 컬럼이 PREFIX 부분으로 잡힘


\\ \\
--# EMP_COM_IOT INDEX 구조
!EMP_COM_IOT_INDEX.jpg!
\\ \\
--# 인덱스 생성 및 분석
SQL> CREATE INDEX IOT_COM_NON_UNIQUE_EMP on EMP_COM_IOT(DEPTNO) COMPRESS;

SQL> ALTER TABLE EMP_COM_IOT MOVE COMPRESS;

SQL> select index_name, uniqueness, compression, num_rows from user_indexes;

SQL> ALTER INDEX IOT_COM_NON_UNIQUE_EMP REBUILD COMPRESS;

SQL> analyze index IOT_COM_NON_UNIQUE_EMP validate structure;

SQL> analyze index SYS_C005709 validate structure;

SQL> analyze index SYS_IOT_TOP_53121 validate structure;

SQL> select * from index_stats;




--# COMPRESS 상태 전환


SQL> ALTER TABLE EMP_COM_IOT MOVE NOCOMPRESS;

SQL> select index_name, uniqueness, compression, num_rows from user_indexes;

SQL> ALTER INDEX IOT_COM_NON_UNIQUE_EMP REBUILD COMPRESS;

SQL> analyze index IOT_COM_NON_UNIQUE_EMP validate structure;

SQL> analyze index SYS_C005709 validate structure;

SQL> analyze index SYS_IOT_TOP_53121 validate structure;

SQL> select * from index_stats;




(on) SYS_IOT_TOP_53121, SYS_C005709 rebuild 하면 에러 발생




--# user_indexes 조회 결과

출처 : OTN포럼

문서에 대하여

  • 최초작성자 : 박혜은
  • 최초작성일 : 2009년 11월 26일
  • 이 문서에 있는 테스트 결과는 DBMS버전과 구성된 환경에 따라 다를 수 있습니다.