본문 바로가기

IT관련

오라클 테이블, 인덱스 압축 OLTP Compress 테스트 (ACO 옵션)

Oracle DB서버의 Disk 스토리지 공간을 절약하기 위해서, 데이터베이스내에 있는 Table, Index 를 압축(Compress)할 수 있습니다.

 


   1) Basic
      SQL> alter table TEST1 move row store compress basic;
   2) Advanced
      SQL> alter table TEST1 move row store compress advanced;

 

Basic 과 Advanced 타입이 있는데,

Basic 의 경우는 초기에 테이블에 데이터를 대량으로 로딩할 때만 압축이 적용됩니다. 이후로 들어오는 데이터는 압축되지 않고 그냥 저장됩니다.

Advanced 의 경우는 시기나 방식에 상관없이 계속 압축됩니다. 단, ACO(Advanced Compression Option) 라는 옵션을 구매해야 정식으로 사용할 수 있습니다.

 

Table, Index 가 얼마나 압축이 되는지 한번 테스트 해 보겠습니다.

 


-- Compress 테스트를 위한 테이블 생성 (connect by 문을 사용해서 2백만건 데이터 생성)
create table TEST1
as
select empno, salary, deptno,
       lpad(ename, 5, ename) as ename,
       lpad(addr, 5, addr) as addr
from ( select level + 10000000 as empno,
              mod(level,1000) + 10000 as salary,
              mod(level,20) as deptno,
              chr(97+mod(level,26)) as ename, 
              chr(65+mod(level,26)) as addr
       from dual
       connect by level <= 2000000
     );

-- 생성된 테이블에 Index 생성
create index IDX1_TEST1 on TEST1 (empno);
create index IDX2_TEST1 on TEST1 (deptno);
create index IDX3_TEST1 on TEST1 (ename);

 

Table, Index 의 압축스크립트는 다음과 같습니다.

 


1) 테이블 압축
alter table TEST1 move row store compress advanced;

2) 인덱스 압축 (low)
alter index IDX1_TEST1 rebuild compress advanced low;
alter index IDX2_TEST1 rebuild compress advanced low;
alter index IDX3_TEST1 rebuild compress advanced low;

3) 인덱스 압축 (high)
alter index IDX1_TEST1 rebuild compress advanced high;
alter index IDX2_TEST1 rebuild compress advanced high;
alter index IDX3_TEST1 rebuild compress advanced high;

 

Advanced 방식에서 테이블을 압축하는 경우에는 1가지 방식만 존재합니다.

인덱스를 압축하는 경우에는 low 와 high 중에서 선택할 수 있습니다.

 

위에서 테이블 압축시 기존 테이블을 "alter table ... move ...;" 커맨드로 테이블을 다시 생성(move)하면서 압축했습니다.

이렇게 하면 TEST1 테이블에 달려있던 기존 인덱스들은 모두 Unusable 상태로 바뀝니다.

이렇게 Unusable 상태로 바뀐 인덱스들은 rebuild 해줘야 합니다.

 

처음 테이블을 생성할 때부터 압축을 하도록 설정할 수도 있는데,

"create table ... " SQL문 맨뒤에 "row store compress advanced" 를 붙여주면 됩니다.

인덱스의 경우도, 인덱스를 처음 생성하면서 압축을 하도록 하는 경우에는,

"create index IDX1_TEST1 on TEST1 (empno) compress advanced high;" 와 같이

기존 인덱스 생성 구문의 맨뒤에 "compress advanced high" 를 붙여주면 됩니다.

 

 

각각의 압축결과는 다음과 같습니다.

 


1) 테이블 압축 전/후
col segment_name for a20
col bytes for 999,999,999
select segment_name, bytes from user_segments where segment_name = 'TEST1';

>> 압축 전
SEGMENT_NAME                BYTES
-------------------- ------------
TEST1                  75,497,472

>> 압축 후
SEGMENT_NAME                BYTES
-------------------- ------------
TEST1                  49,283,072


2) 인덱스 압축 전/후 (low/high)
col segment_name for a20
col bytes for 999,999,999
select segment_name, bytes from user_segments where segment_name like 'IDX%_TEST1';

>> 압축 전
SEGMENT_NAME                BYTES
-------------------- ------------
IDX1_TEST1             39,845,888
IDX2_TEST1             33,554,432
IDX3_TEST1             39,845,888

>> 압축 후 (low)
SEGMENT_NAME                BYTES
-------------------- ------------
IDX1_TEST1             39,845,888
IDX2_TEST1             26,214,400
IDX3_TEST1             26,214,400

>> 압축 후 (high)
SEGMENT_NAME                BYTES
-------------------- ------------
IDX1_TEST1             16,777,216
IDX2_TEST1              9,437,184
IDX3_TEST1              6,291,456

 

테이블은 약 40% 정도 압축효과가 나왔습니다.

인덱스에서 IDX1_TEST1 (empno) 처럼 중복되는 데이터가 없는 Unique 한 데이터에 대해 압축을 하는 경우는 low 로 압축하면 변화가 없네요.

high 로 압축하면 50% 이상 줄어드는 것을 확인할 수 있습니다.

 

압축율은 데이터에 따라 달라집니다.

Advanced 방식에서 Table 압축과 Index low 압축의 경우는 Deduplication 방식으로 압축을 합니다. 따라서 기본적으로 중복되는 데이터가 많아야 압축율이 높게 나옵니다.