본문 바로가기
Oracle/운영

alter table [테이블명] compress VS alter table [테이블명] move compress

by 취미툰 2022. 5. 4.
반응형

compress 된 테이블에 컬럼 추가하는 작업이 있어서 작업 하는 중에 명령어를 다르게 쳤더니 안되어서 둘의 차이를 찾아보고 정리한 글입니다.

 

공통점

두 명령어 다 compress를 하는 명령어입니다.

 

차이점

alter table [테이블명] compress 은 이후 들어오는 data에 대해서 compress를 진행하겠다라는 뜻입니다.

alter table [테이블명] move compress 은 이전에 저장되어 있는 data에 대해서 compress를 진행하겠다는 뜻입니다.

(alter table [테이블명] move tablespace [테이블스페이스명]; 과 비슷한 방식으로 nocompress -> compress로 reorg 한다는 느낌의 개념으로 보면 될 것 같습니다. 하지만 실제 alter table move 작업과는 다르게 index는 invalid 상태로 빠지지 않았고, rebuild 작업의 필요는 없었습니다. )

 

두 명령어 다 시도 후 dba_tables의 compression,compress_for 컬럼을 확인하면 변경이 되는 것을 확인할 수 있습니다.

 

테스트는 compress되어 있는 테이블을 nocompress로 변경하는 테스트입니다.

 

alter table [테이블명] nocompress

 

1. 현재 테이블의 딕셔너리 뷰 확인

select table_name,compression,compress_for from dba_tables
where table_name='DW_UD_UDL6103'


TABLE_NAME     COMPRESSION            COMPRESS_FOR                   
-------------- ---------------------- ------------------------------ 
DW_UD_UDL6103  ENABLED                QUERY HIGH

 

2.명령어 수행

금방 수행됩니다.

ALTER TABLE EDWOWN.DW_UD_UDL6103 NOCOMPRESS;

 

 

3.딕셔너리뷰 확인

SQL> select table_name,compression,compress_for from dba_tables where table_name='DW_UD_UDL6103';

TABLE_NAME         COMPRESSION            COMPRESS_FOR                   
------------------ ---------------------- ------------------------------ 
DW_UD_UDL6103      DISABLED                                             

1 rows selected.

 

4.ADD 컬럼 시도

이후의 데이터를 nocompress하겠다는 뜻이므로 현재의 테이블 data의 상태는 compress되어있고, 따라서 컬럼 추가 시 에러가 발생합니다.

ALTER TABLE EDWOWN.DW_UD_UDL6103 ADD REI_TAM NUMBER(18) DEFAULT 0 ; 

에러 발생
ORA-39726 : unsupported add/drop column operation on compressed tables

 

 

 

alter table [테이블명] move nocompress

테이블을 다시 원복 후 시도하였습니다.

 

1.원복

ALTER TABLE EDWOWN.DW_UD_UDL6103 COMPRESS FOR QUERY HIGH;

 

2.딕셔너리 뷰 확인

select table_name,compression,compress_for from dba_tables
where table_name='DW_UD_UDL6103'


TABLE_NAME     COMPRESSION            COMPRESS_FOR                   
-------------- ---------------------- ------------------------------ 
DW_UD_UDL6103  ENABLED                QUERY HIGH

 

3.move nocompress 명령어 수행

테이블 크기가 클 경우 시간이 걸립니다.

ALTER TABLE EDWOWN.DW_UD_UDL6103 MOVE NOCOMPRESS;

 

4.딕셔너리 뷰 확인

현재 테이블에 있는 인덱스의 상태가 VALID인 것을 확인할 수 있습니다.

SQL> select table_name,compression,compress_for from dba_tables where table_name='DW_UD_UDL6103';

TABLE_NAME          COMPRESSION            COMPRESS_FOR                   
------------------- ---------------------- ------------------------------ 
DW_UD_UDL6103       DISABLED                                             

1 rows selected.



SQL> select object_name,status from dba_objects 
where object_name='PK_DW_UD_UDL6103';

OBJECT_NAME          STATUS       
-------------------- ------------ 
PK_DW_UD_UDL6103     VALID       

1 rows selected.

 

5.ADD 컬럼 명령어 수행

ALTER TABLE EDWOWN.DW_UD_UDL6103 ADD REI_TAM NUMBER(18) DEFAULT 0 ;

 

6.작업 후 다시 compress로 변경

ALTER TABLE EDWOWN.DW_UD_UDL6103 MOVE COMPRESS FOR QUERY HIGH;

 

7.딕셔너리 뷰 확인

SQL> select table_name,compression,compress_for from dba_tables where table_name='DW_UD_UDL6103';

TABLE_NAME      COMPRESSION            COMPRESS_FOR                   
--------------- ---------------------- ------------------------------ 
DW_UD_UDL6103   ENABLED                QUERY HIGH                    

1 rows selected.



SQL> select object_name,status from dba_objects 
where object_name='PK_DW_UD_UDL6103';

OBJECT_NAME          STATUS       
-------------------- ------------ 
PK_DW_UD_UDL6103     VALID

 

인덱스의 상태는 VALID이지만 COMPRESS를 다시 시도함으로써 블록의 구조가 변경되었으므로 Table의 인덱스를 rebuild 해주는 것을 권장드립니다. 

 

8.인덱스 rebuild

ALTER INDEX EDWOWN.PK_DW_UD_UDL6103 REBUILD;

 

끝.

반응형

댓글