DELETE, TRUNCATE는 두 개 모두 테이블 내용을 삭제하는 쿼리이다. 하지만 둘이 완전히 같은 기능을 하는 것은 아니다. 두 쿼리의 특징을 적어둔다.
DELETE
DML(Data Manipulation Language, 데이터 조작 언어) 중 하나
[ WITH <common_table_expression> [ ,...n ] ]
DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] { <object> | rowset_function_limited [ WITH ( <table_hint_limited> [ ...n ] ) ] }
[ <OUTPUT Clause> ]
[ FROM <table_source> [ ,...n ] ]
[ WHERE { <search_condition> | { [ CURRENT OF { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ]
[ OPTION ( <Query Hint> [ ,...n ] ) ] [; ]
<object> ::=
{ [ server_name.database_name.schema_name. | database_name. [ schema_name ] . | schema_name. ] table_or_view_name }
-- 예시
DELETE FROM test;
- 테이블 내 데이터를 삭제하며, 테이블 용량이 감소하지 않는다. 데이터를 삭제해도 사용 스토리지를 반환하지 않는다.
- Commit 이전에는 Rollback이 가능하다. Rollback 정보를 기록하기 때문에 수행 완료에 시간이 걸린다.
- 행(row)이 많은 테이블의 데이터 삭제 시 많은 시스템 자원을 소모한다.
- 전체 또는 일부를 삭제하며, 삭제 행수를 반환한다.
TRUNCATE
DDL(Data Definition Language, 데이터 정의 언어) 중 하나
TRUNCATE TABLE [ { database_name.[ schema_name ]. | schema_name . } ] table_name [ ; ]
-- 예시
TRUNCATE TABLE test;
- 테이블의 모든 행을 삭제하여, 테이블 용량이 줄어들고 인덱스 등도 삭제한다. 테이블이 사용하던 스토리지 중 테이블 생성 시 할당된 공간만 남기고 전부 반환한다.
- RollBack이 불가능하다.
- 삭제 행수를 반환하지 않는다.