행위

오라클 테이블 압축 table compress

DB CAFE

thumb_up 추천메뉴 바로가기


1 오라클 압축 compress[편집]

1.1 오라클의 compress 기능 개요[편집]

  1. table, index, mview, partition table의 각 partition 에 적용할 수 있음.
  2. alter table ~ move 명령어를 사용하면 해당 오브젝트 전체에 lock 발생
  3. 압축으로 인한 스토리지 비용절감/IO개선 효과
  4. insert, delete 에서는 성능차이가 거의 발생하지 않지만, update시에 성능 차이 많이 발생
  5. 데이터가 많이 변하고 많은 세션이 있는 온라인 OLTP 환경 에서는 부적합
  6. 데이터가 변화가 거의 없고, 조회성 업무가 많은 DW 환경에서 적합.

1.2 명령어[편집]

1.2.1 압축[편집]

  • 테이블 압축
alter table <테이블명> move compress;
  • 파티션 테이블 압축
alter table <테이블명> move partition tablespace <테이블스페이스명> compress;
  • 인덱스 압축
alter index <인덱스명> rebuild partition tablespace <테이블스페이스명> compress;

1.2.2 해제[편집]

alter table <테이블명> move nocompress;
alter index <인덱스명> rebuild nocompress

1.3 압축 실습[편집]

1.3.1 컬럼에 같은 데이터가 많이 있을 경우 압축율 테스트[편집]

-- 1.테이블 생성 
create table t1 (col1 number, col2 varchar2(100), col3 varchar2(100));

-- 2.데이터 입력 (중복값이 많은건 10만건 입력 )        
insert into t1
select level
     , 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
     , 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
  from dual
connect by level <= 100000;
commit;

-- 3.압축을 위한 테이블 생성        
create table com_t1
    as select * from t1 where 1=2;

-- 4. 테이블 압축 처리  
alter table com_t1 move compress;
-- alter table com_t1 compress; 명령어가 아님. move로 해야함 

--- 5. 입력 
insert /*+ append */ into com_t1
select * from t1;
commit;

-- 6. 압축율 비교 
select segment_name, bytes
  from dba_segments 
 where segment_name in ('T1','COM_T1');
       
 SEGMENT_NAME       BYTES
 ------------------------------ ----------
          T1     17825792
       COM_T1     15728640

1.3.2 컬럼에 같은 데이터가 거의 없을 경우 압축율[편집]

-- 1.테이블 생성 
create table t2 (col1 number, col2 varchar2(100), col3 varchar2(100));
-- 2.데이터입력 10만건 (데이터 중복을 줄여서 입력)       
insert into t2
select level
     , 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
     , 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
  from dual
connect by level <= 25000
 union all
select level
     , 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'
     , 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
 from dual
connect by level <= 25000
  union all
 select level
      , 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'
      , 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
   from dual
connect by level <= 25000
  union all
 select level
      , 'gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg'
      , 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
   from dual
connect by level <= 25000;
       
commit;

--3. 압축 테이블 생성        
create table com_t2
    as
select * from t2 where 1=2;

--4. 테이블 압축        
alter table com_t2 move compress;

--5. 추가로 입력        
insert /*+ append */ into com_t2
select * from t2;
commit;
 
-- 6. 테이블 압축률 조회       
select segment_name, bytes 
  from dba_segments 
 where segment_name in ('T2','COM_T2');
    
SEGMENT_NAME BYTES
 ----------- ----------
 T2          17825792
 COM_T2      15728640

1.3.3 테이블생성시에 compress 옵션 추가[편집]

create table init_com_t2
compress
    as select * from t1;
       
select segment_name, bytes 
  from dba_segments 
 where segment_name in ('t2','com_t2','init_com_t2');
       
SEGMENT_NAME       BYTES
------------------------------ ----------
init_com_t2     2097152
         t2    17825792
    comt_t2    15728640