Open-Closed Principle

[MS-SQL]데이터 삭제 DELETE vs TRUNCATE 본문

Programming/MS-SQL

[MS-SQL]데이터 삭제 DELETE vs TRUNCATE

대박플머 2016. 2. 3. 23:17

DELETE

DELETE 구문은 술어를 기반으로 테이블에 있는 데이터를 지울 때 사용되는 표준 구문이다. 표준 형태의 구문에는 단 두 개의 절 만 가질 수 있다. 하나는 지우고자 하는 대상 테이블을 지정하는 FROM 절이며, 다른 하나는 술어 부분을 지정하는 WHERE 절이다. 술어가 TRUE 평가되는 행들의 하위 집합만 삭제된다. 

예를 들어, 아래 나오는 쿼리는 dbo.Orders 테이블에 있는 데이터 중 2007년도 이전에 발생된 주문 건들을 삭제하게 된다. 

1
2
Delete From dbo.Orders
Where Year(dbo.Orders.orderdate) < 2007
cs

삭제된 행을 출력하는 메시지는 NOCOUNT 세션 옵션이 OFF로 설정되어 있을 때에만 나타난다. 이 옵션의 기본값은 OFF다. 만약, 이 값을 ON으로 변경한다면 SOL Server는 명령이 성공적으로 실행되었다는 메시자만 출력할 것이다. 

참고, DELETE 구문은 전체가 로깅된다. 따라서 많은 행들을 삭제할 경우에는 시간이 소요될 수 있다. 

TRUNCATE

TRUNCATE 구문은 테이블의 모든 행들을 삭제한다. DELETE 구문과는 달리 TRUNCATE는 필터가 없다. 

DELETE에 비해 TRUNCATE가 가지는 장점은, DELETE는 모든 작업을 로그에 남기는 데 비해 TRUNCATE는 최소한의 로그만 남긴다는 점이다. 이로 인해 처리 성능에서 아주 큰 차이가 있다. 예를 들어, 수밸만 건이 저장되어 있는 테이블의 모든 행을 지우고자 할 때 TRUNCATE 구문을 사용한다면, 수초 내에 명령이 완료된다. 하지만 DELETE 구문을 사용한다면, 작업이 완료되는 데 수분에서 많게는 수시간이 걸릴 수도 있다. 

참고1, TRUNCATE는 최소 로깅만 한다고 하였다. 이는 로깅을 전혀 하지 않는다는 말은 아니다. 최소 로깅을 한다는 것은 오나전히 트랜잭션 단위로 처리된다는 것을 말하며(일반적으로 ㅁ낳이 오해하는 부분이다.), ROLLBACK이 발생하는 경우에는 SOL Server에서 이 작업을 취소하고 다시 복원시킬 수 있다는 것을 의미한다. 

참고2, TRUNCATE와 DELETE 간의 차이는 테이블에 identity컬럼이 있을 때에 존재한다. TRUNCATE는 identity 값을 초기값으로 재성절하는 데 비해 DELETE는 그렇지 않다. 

'Programming > MS-SQL' 카테고리의 다른 글

[MS-SQL]공통 테이블 식(CTE)  (0) 2016.02.12
[MS-SQL] DELETE JOIN  (0) 2016.02.04
[MS-SQL]SELECT INTO 구문  (0) 2016.02.03
[MS-SQL]Identity 속성  (0) 2016.02.02
OFFSET-FETCH 사용법  (0) 2015.04.29