오라클 테이블 압축 table compress
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 오라클 압축 compress[편집]
1.1 오라클의 compress 기능 개요[편집]
- table, index, mview, partition table의 각 partition 에 적용할 수 있음.
- alter table ~ move 명령어를 사용하면 해당 오브젝트 전체에 lock 발생
- 압축으로 인한 스토리지 비용절감/IO개선 효과
- insert, delete 에서는 성능차이가 거의 발생하지 않지만, update시에 성능 차이 많이 발생
- 데이터가 많이 변하고 많은 세션이 있는 온라인 OLTP 환경 에서는 부적합
- 데이터가 변화가 거의 없고, 조회성 업무가 많은 DW 환경에서 적합.
1.2 명령어[편집]
1.2.1 압축[편집]
- 테이블 압축
alter table <테이블명> move compress;
- 파티션 테이블 압축
alter table <테이블명> move partition tablespace <테이블스페이스명> compress;
- 인덱스 압축
alter index <인덱스명> rebuild partition tablespace <테이블스페이스명> compress;
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