태그 보관물: delete

Oracle Delete문 사용 후 Tablespace 정리하기

일단 Tablespace 용량 확인 쿼리

select substr(a.tablespace_name,1,30) tablespace,
round(sum(a.total1)/1024/1024,1) “TotalMB”,
round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1) “UsedMB”,
round(sum(a.sum1)/1024/1024,1) “FreeMB”,
round((round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1))/round(sum(a.total1)/1024/1024,1)*100,2) “Used%”
from
(select tablespace_name,0 total1,sum(bytes) sum1,max(bytes) MAXB,count(bytes) cnt
from dba_free_space
group by tablespace_name
union
select tablespace_name,sum(bytes) total1,0,0,0
from dba_data_files
group by tablespace_name) a
group by a.tablespace_name
order by tablespace;

 

위 쿼리로 조회하면 UsedMB와 FreeMB를 조회 할 수 있다.

나는 UsedMB를 처리해야 하는 것.

데이터를 지우기에 앞서 Tablespace가 아닌 해당 Table에서 사용 중인 block를 확인해보았다.

select count(distinct dbms_rowid.rowid_block_number(rowid)) blocks from person;
select blocks, extents from user_segments where segment_name = ‘PERSON’;

 

 

 

person 테이블에서 사용 중인 block는 1241개고, 할당된 block는 1280개.

 

이제 Delete 문으로 데이터를 삭제한다.

DELETE FROM [TABLENAME] WHERE [COLUMN] = [VALUE]

 

27319개의 row를 삭제하였다.

다시 block 사용량을 확인하였다.

 

Delete 문으로 데이터를 지웠으나 다들 알다시피 delete 문으로는 Tablespace 용량이 줄어들지 않는다.

(삭제 조건을 줘야하기 때문에 truncate는 사용 불가능)

사용한 block는 줄어들었으나 hwm은 줄어들지 않았다.

 

이제 shrink를 실행해보았다.

ALTER TABLE PERSON SHRINK SPACE
ALTER TABLE PERSON SHRINK SPACE CASCADE

 

 

HWM도 줄어들고 Tablespace 사용량도 줄어들었다.

 

★ ORA-10636: ROW MOVEMENT is not enabled 에러 발생 시

row movement 기능이 꺼져 있는 것이니 켜줘야 한다.

ALTER TABLE PERSON ENABLE ROW MOVEMENT;

row movement 기능을 끄려면 아래 쿼리를 수행한다.

ALTER TABLE [테이블명] DISABLE ROW MOVEMENT;

 

★ SHRINK 차이점

우측 설명은 그냥 내가 이해한대로 작성한 것임

CASCADE의 이해도가 부족한데 좀 더 찾아봐야겠음.

 

 

SHRINK SPACE HWM 축소
SHRINK SPACE COMPACT Block 정리는 수행하지만 HWM을 건드리지 않음
SHRINK SPACE CASCADE 연관된 인덱스 정리

 

공식 URL : http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_3001.htm#i2192484