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 방식으로 압축을 합니다. 따라서 기본적으로 중복되는 데이터가 많아야 압축율이 높게 나옵니다.
'IT관련' 카테고리의 다른 글
오라클 병렬처리(Parallel Processing)관련 주의사항 (의도하지 않은 병렬수행, default degree) (0) | 2020.11.16 |
---|---|
오라클 에러 정보 (ORA-01144) - 데이터파일 최대크기를 초과한 경우 (0) | 2020.10.29 |
ASM 구성시 LUN 크기, 갯수가 성능에 미치는 영향 (0) | 2020.10.21 |
오라클 에러 정보 (ORA-01110) - 데이타파일 관련된 에러시 부가정보를 제공하는 (0) | 2020.10.05 |
(12cR1 신기능) 오라클 Lateral Inline View, 인라인뷰에서 조인시 ORA-00904 에러 방지 (0) | 2020.10.05 |