DELETE vs DROP vs TRUNCATE
DELETE vs DROP vs TRUNCATE
TABLE에서 행을 삭제하는 세 가지 방법이 있다. DELETE, DROP, TRUNCATE 의 3가지 방법이 있는데 각각에 대해서 알아본다.
결론부터 말하자면,
Delete : 데이터만 삭제하고 Commit이전에는 Rollback이 가능하다. 데이터를 모두 Delete해도 사용했던 Storage는 Release되지 않는다.
DROP : 테이블의 정의 자체를 완전히 삭제함하고 Rollback 불가능하다. 또한, 테이블이 사용했던 Storage를 모두 Release 한다.
Truncate : 테이블을 최초 생성된 초기상태로 만들고, Rollback 불가능하다. 테이블이 사용했던 Storage중 최초 테이블 생성시 할당된
Storage만 남기고 Release 된다.
방법 |
장점 |
단점 |
DELETE(DML) |
원하는 데이터 삭제 |
테이블의 용량 감소X |
TRUNCATE (DDL) |
테이블 자료들 모두 삭제 |
원하는 데이터만 삭제불가능, 복구가 굉장히 힘듬 |
DROP (DDL) |
테이블 자체의 삭제 |
1. DELETE
DELETE 명령어를 사용하여 TABLE의 행을 삭제할 수 있다.
DELETE 문을 사용할 때 TABLE이나 CLUSTER에 행이 많으면 행이 삭제 될 때마다 많은 SYSTEM 자원이 소모된다.
예를 들어 CPU 시간,REDO LOG 영역, TABLE이나 INDEX에 대한 ROLLBACK SEGMENT 영역 등의 자원이 필요하다. TRIGGER가 걸려있다면 각 행이 삭제될 때 실행된다. 이전에 할당되었던 영역은 삭제되어 빈 TABLE이나 CLUSTER에 그대로 남아 있게 된다.
사용법 : DELETE FROM 테이블명 (WHERE 조건) 조건은 생략가능
2. DROP
TABLE을 삭제한 다음 재생성할 수 있다. TABLE이나 CLUSTER를 삭제하고 재생성하면 모든 관련된 INDEX, CONSTRAINT,TRIGGER도 삭제되며, 삭제된 TABLE이나 CLUSTERED TABLE에 종속된 OBJECTS는 무효화 된다. 삭제된 TABLE이나 CLUSTERED TABLE에 부여된 권한도 삭제된다.
사용법 : DROP TABLE 테이블명
3. TRUNCATE
SQL명령어 TRUNCATE를 사용하여 TABLE의 모든 행을 삭제할 수 있다. TRUNCATE 명령어는 TABLE이나 CLUSTER에서 모든 행을 삭제하는 빠르고 효율적인 방법이다. TRUNCATE 명령어는 어떤 ROLLBACK 정보도 만들지 않고 즉시 COMMIT하고, DDL 명령문으로 ROLLBACK될 수 없다.
TRUNCATE 명령문은 잘라 버릴 TABLE과 관련된 구조(CONSTRAINT, TRIGGER 등)과 권한에 영향을 주지 않고, TABLE에서 ROW를 삭제하면 해당 TABLE에 걸려 있는 TRIGGER는 실행되지 않는다.
AUDIT 기능이 ENABLE되어 있으면, TRUNCATE 명령문은 DELETE 문에 해당하는 AUDIT 정보를 생성하지 않는다. 대신 발생한 TRUNCATE 명령문에 대한 단일 AUDIT RECORD를 생성한다.