테이블스페이스 ts_a 에는 있던 테이블을 ts_b 라는 테이블스페이스로 이동하였습니다.
ALTER TABLE [TABLE_NAME] MOVE TABLESPACE [NEW_TABLESPACE_NAME]; 명령을 사용하였습니다.
이동후에는 ts_a의 데이터 파일의 용량은 줄어들고 ts_b의 용량은 늘어날 것으로 생각했는데요,
실제 이동 후에 ts_a의 용량은 줄어들지 않더군요.
SELECT A.TABLESPACE_NAME, A.FILE_ID, A.FILE_NAME,
ROUND(A.BYTES/1024/1024,2) AS "Size(MB)",
ROUND(B.FREE_BYTES/1024/1024,2) AS "Free(MB)"
FROM DBA_DATA_FILES A,
(
SELECT FILE_ID, SUM(BYTES) AS FREE_BYTES, MAX(BYTES) AS MAX_FREE
FROM DBA_FREE_SPACE
GROUP BY FILE_ID
) B
WHERE A.FILE_ID = B.FILE_ID(+)
로 조회하면 Size는 이동 전과 동일하고 Free 만 늘어나더군요.
ts_a 의 데이터파일의 Size를 Free만큼 줄이는 방법이 없을까요?
답변부탁드릴게요~!
TBS의 경우 사이즈를 임의로 늘리거나 줄일수는 있습니다.
alter database 의 명령으로 tbs 파일의 실제 사이즈를 조절이 가능하긴 합니다.
허나
실제 tbs의 파일 사이즈를 사용공간만큼만 남기고 프리사이즈를 빼서 줄이는 것은 거의 불가능 할거에요.
저장된 데이터의 경우 최소단위인 block 에서 부터 extent , segment단위로 저장이 되는데
데이터가 단편화 되어 있을수도 있고, 여러가지 변수가 있기 때문입니다.
TBS데이터 파일 사이즈를 늘리는건 간단하지만 줄이는건 뜻하시는 용량만큼 줄지 않을 경우도 있습니다.
HWM 확인하시고 HWM 보다 크게 resize 하시는 건 가능합니다.
SELECT A.TABLESPACE_NAME, A.FILE_ID, A.FILE_NAME,
ROUND(A.BYTES/1024/1024,2) AS "Size(MB)", ROUND(B.FREE_BYTES/1024/1024,2) AS "Free(MB)", (select max(block_id) from dba_extents b where a.file_id = b.file_id)*(select value from v$parameter where name='db_block_size')/1024/1024 hwm FROM DBA_DATA_FILES A, ( SELECT FILE_ID, SUM(BYTES) AS FREE_BYTES, MAX(BYTES) AS MAX_FREE FROM DBA_FREE_SPACE GROUP BY FILE_ID ) B WHERE A.FILE_ID = B.FILE_ID(+) /