기존에는 테이블을 새로 작성(reorg) 작업을 통해
커진 테이블 스페이스 크기를 복구 가능하였으나
10g 부터는 shrink 기능을 이용하여 손쉽게 테이블을 줄일수 있게 되었다.
Shrink 기능은 HWM(High Water Mark)를 줄일수 있는 기능이다.
- 사전 확인 사항
init.ora 파일내에 compatible = 10.2 이상인것을 확인
ASSM (Automatic Segment Space Management) 테이블 스페이스여만 가능
각 테이블 조회 방법은
SELECT obj.owner
,obj.table_name
,(CASE WHEN NVL(idx.cnt, 0) < 1 THEN 'YES' ELSE 'NO' END) shrinkable
FROM dba_tables obj,
(SELECT table_name, COUNT(rownum) cnt
FROM dba_indexes
WHERE index_type LIKE 'FUN%'
GROUP BY table_name) idx
WHERE obj.table_name = idx.table_name(+)
AND obj.tablespace_name = upper('&1')
쿼리를 통해 (테이블 스페이스 명을 인자값으로)
확인 가능하다.
1. 테이블 검색 방법
SELECT * FROM TABLE(DBMS_SPACE.ASA_RECOMMENDATIONS());
아래와 같이 테이블의 DBA_SEGMENTS에서 볼수 있는 크기와
축소 가능 크기가 조회된다.
SEGMENT_OWNER |
SEGMENT_NAME |
SEGMENT_TYPE |
PARTITION_NAME |
ALLOCATED_SPACE |
USED_SPACE |
RECLAIMABLE_SPACE |
MAX_TI |
SMR_IF_LOG |
TABLE |
|
6761793074 |
5910149080 |
851643994 |
MAX_TI |
SMR_IF_LOG_I01 |
INDEX |
|
478455081 |
420139142 |
58315939 |
MAX_TI |
SMR_IF_LOG_I02 |
INDEX |
|
411921243 |
398204079 |
13717164 |
2. 축소하기
가장 먼저 행들을 이동 가능하도록 변경한다.
위의 SMR_IF_LOG 테이블을 기준으로 설명하겠다.
ALTER TABLE SMR_IF_LOG
ENABLE ROW MOVEMENT;
--> 반대로는 ALTER TABLE SMR_IF_LOG DISABLE ROW MOVEMENT; 이다..
이제 SHRINK 기능을 수행할수 있으며
다음 3가지 형태로 가능하다
① ALTER TABLE SMR_IF_LOG SHRINK SPACE;
-- SMR_IF_LOG 테이블의 공간만 TABLESPACE로 환원
② ALTER TABLE SMR_IF_LOG SHRINK SPACE CASCADE;
-- 모든 관련 OBJECT까지 TABLESPACE으로 공간 환원
③ ALTER TABLE SMR_IF_LOG SHRINK SPACE COMPACT;
-- 행들만 이동시킴.
※ SHRINK 를 적용 시킬 없는 테이블
UNDO segments
temporary segments
clustered tables
tables with a column of datatype LONG
LOB indexes
IOT mapping tables and IOT overflow segmnets
tables with MVIEWS with ON COMMIT
tables with MVIEWS which are based on ROWIDs.