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;
끝.
'Oracle > 운영' 카테고리의 다른 글
[partition] MODIFY DEFAULT ATTRIBUTES COMPRESS FOR OLTP vs COMPRESS FOR OLTP 차이 (0) | 2022.07.11 |
---|---|
[19c] Outline 기능 이용하여 Hint 없이 실행계획 변경 (0) | 2022.06.07 |
INDEX Rebuild시 parallel옵션 사용에 따른 degree확인 테스트(partitioned index 포함) (0) | 2022.05.03 |
SQL*Loader 를 이용해서 리스너 로그 -> DB 테이블로 넣기 (0) | 2022.04.22 |
Alert Log 파일 위치 확인 (0) | 2022.04.19 |
댓글