DELETE에 조건을 주지 않는 것과 TRUNCATE는 같은 기능을 한다.
둘 다 테이블 구조를 남기지만 내부 데이터를 모두 삭제하게 된다.
그럼에도 TRUNCATE의 성능이 DELETE보다 좋은 이유는 무엇인지 차이점을 비교해보자.
약 O(N)의 작업 시간
DELETE는 데이터를 한 행씩 삭제한다. 행을 삭제하기 전에 로그를 남기고 해당 행에 대한 트랜잭션 로그를 작성한다.
이로 인한 장점은 롤백이 가능하다는 것이다.
그러나 로깅 및 트랜잭션 관리를 위한 추가적인 오버헤드가 발생하게 된다.
또한 AUTO_INCREMENT 값에 대해 삭제된 행들을 리셋하지 않는다.(이전 값부터 증가)
약 O(1)의 작업 시간
TRUNCATE는 로깅 및 트랜잭션 로그를 작성하지 않으며, 한 행씩 삭제를 하지 않고 모든 데이터를 삭제하여 테이블을 초기 상태로 되돌린다. 그렇기 때문에 대량의 데이터를 삭제할 때 빠른 삭제가 가능하다는 장점이 있다. 하지만 롤백이 불가능하기 때문에 DELETE에 비해서 위험성이 있다.
또한 AUTO_INCREMENT 값에 대해 삭제된 행들을 리셋하며, 첫번째 행부터 다시 시작한다.(초기값부터 증가)
롤백 가능성이 있는 작업의 경우 DELETE를, 롤백이 필요 없는 대량 데이터 삭제에 대해서는 TRUNCATE를 사용하는 것이 성능에 유리하다.