본문 바로가기
Oracle/운영

Delete와 Truncate

by 취미툰 2020. 9. 24.
반응형

운영업무를 하다보면 Delete와 Truncate에 대해서 설명해야 할때가 있었습니다. 따라서 둘의 차이를 정리하는 글을 포스팅해보겠습니다.

 

 

Delete

DML언어 중 하나로 데이터를 삭제할 수 있는 명령어입니다. 특징은 Delete 후에 Rollback시 원복할 수 있다는 것입니다. 따라서 Delete를 하게되면 원본 데이터를 UNDO에 저장하게 되는 작업이 필수적으로 들어갑니다.  또한 삭제하여도 테이블 용량은 줄어들지 않고 그대로인 상태가 됩니다. 또한 전체 데이터 삭제도 가능하고, 조건절 등을 추가하여 일부데이터만 삭제도 가능합니다.

 

 

TRUNCATE

 

DDL언어이며, 테이블을 최초 생성된 상태로 만듭니다.  테이블 내의 모든 데이터를 삭제하게 되며, 테이블의 용량도 생성 시 초기 용량상태로 돌아갑니다. UNDO에 저장하는 작업이 없으므로 Rollback이 불가능합니다. 그리고 일부 글에서 Truncate 시에는 인덱스도 같이 삭제된다는 글이있는데 테스트 결과 인덱스는 그대로 남아있게되고 DROP 시 인덱스가 같이 삭제됩니다. 데이터의 구조는 남기고 용량을 초기화해야할 일이 있을 때 사용합니다.

 

Truncate 시 Index 도 삭제되는지 테스트

 

 

TEST@ysbae> create table TRUN_TEST (a number, b varchar2(10);

 

TEST@ysbae> create index iiii on trun_test(a);

Index created.

 

테이블 인덱스 생성 후 데이터 삽입;

 

TEST@ysbae> insert into trun_test values(1,'aa');

1 row created.

TEST@ysbae> /

1 row created.

TEST@ysbae> /

1 row created.

TEST@ysbae> /

1 row created.

TEST@ysbae> /

1 row created.

TEST@ysbae> commit;

Commit complete.

 

5건 삽입 후 commit 수행 후

TRUNCATE 수행하여 테이블안의 데이터와 인덱스 상태 체크

 

TEST@ysbae> truncate table trun_test;

Table truncated.

TEST@ysbae> select * from trun_test;

no rows selected

 

TEST@ysbae>select index_name From user_indexes where table_name='TRUN_TEST'


INDEX_NAME
--------------------------------------------------------------------------------------------------------------------------------
IIII

1 row selected.

 

TRUNCATE를 해도 인덱스는 그대로 남아있는것을 확인할 수 있습니다.

 

TEST@ysbae> drop table trun_test;

Table dropped.

 

TEST@ysbae> select index_name From user_indexes where table_name='TRUN_TEST' 


no rows selected

 

DROP TABLE시에는 INDEX도 같이 삭제됩니다.

 

끝.

반응형

댓글