TRUNCATE 와 DELETE 의 차이

KUN·2025년 3월 19일

DML 을 배우는 도중 궁금한게 생겼습니다.

  1. DDL 의 TRUNCATE
  2. DML 의 DELETE

'둘다 테이블의 데이터를 지운다.'
라는 개념은 같지만 이 과정에서 굳이 DDL 과 DML 을 분류한 이유를 알기 위해 조사 해봅니다.

  1. DDL 은 원자성을 가진다.
    MYSQL
    DDL 명령어(데이터 정의 언어)의 원자성(atomicity)에 관한 설명입니다. 여기서 중요한 점은 DDL 명령어의 실행이 원자적으로 이루어지며 롤백이 불가능하다는 것입니다.
원자성(atomicity)이란 "하나의 작업이 완전히 수행되거나, 전혀 수행되지 않는 상태"를 의미합니다.
  1. 그럼 TRUNCATE 는 DDL 로 써 원자성을 보장 받는가?
    MYSQL - TRUNCATE
    위 문서와 MYSQL DDL 문서에도 적혀있 듯. TRUNCATE 는 원자성을 보호 받지 못합니다.
    이유는 정리해보면 다음과 같습니다.
1. 테이블 구조의 변경
TRUNCATE는 단순히 테이블에서 모든 행을 삭제하는 것이 아니라 
테이블을 비우기 위해 테이블을 새로 만드는 방식으로 동작합니다.
이 과정에서 테이블의 구조적 변경이 발생할 수 있는데, 
이로 인해 MySQL은 원자성을 보장하는 것보다 더 복잡한 처리를 해야 합니다.
2. 성능 최적화
TRUNCATE는 테이블 전체를 재구성하는 방식이므로 빠르지만, 
이러한 최적화는 원자성을 희생하는 방식입니다.
TRUNCATE는 내부적으로 테이블 삭제 후 새로 생성하는 방식을 취하기 때문에, 
그 사이에 오류가 발생하면 중간 상태에서 롤백할 수 없는 문제가 생깁니다.
3. LOCK 및 제약 조건
TRUNCATE는 테이블에 대한 락(Lock)을 걸어 작업을 수행하고, 
외래 키 제약(foreign key constraints)을 무시할 수 있습니다. 
이로 인해 테이블에서 데이터를 삭제하는 과정에서 일어날 수 있는 예기치 않은 
문제들(예: 외래 키 제약으로 인한 실패)이 발생할 가능성이 높습니다.
정리 : DDL 명령어는 원자성을 보장받긴 하지만, 
구현 방식에 따라 DDL 명령어가 항상 원자성을 보장하는 것은 아니다.
특정 상황에서 예외가 있을 수 있다.
  1. 속도는 어떤 차이가 있는가?
    MYSQL - TRUNCATE 그리고 속도차이 관련 Lob Blog 를 보면 속도차이가 확실하게 있음이 보입니다.

    Our team's productivity depends on the performance of this test suite, since they run very frequently and are an integral part of the deployment pipeline. The nearly 3,200 tests included are responsible for the correctness of one of our most critical codebases. The codebase has constant activity, and changes are continuously committed by authors from multiple teams. The entire suite runs before every commit is merged, as well as after each commit lands in master.
    We were surprised when we measured the overhead of clearing table data. Before each test runs, no fewer than 32 tables are wiped clean with a TRUNCATE. The 'TRUNCATE's accounted for 20-200 milliseconds of overhead for each test. In other words, this added 1 to 5 minutes of overhead for the entire suite when run serially. (In practice, we run groups of tests in parallel, so the perceived total overhead was closer to about 1 minute total.)

이 글에 따르면, TRUNCATE는 대용량 테이블을 처리할 때 훨씬 빠릅니다. 
TRUNCATE는 테이블을 한 번에 비우며, 각 행을 삭제하는 방식이 아니라 테이블의 데이터를 빠르게 제거합니다. 
반면, DELETE는 소규모 테이블에서 더 효율적입니다.
하지만 TRUNCATE는 트리거를 실행하지 않기 때문에 데이터 무결성이 중요한 경우 DELETE를 사용해야 할 수 있습니다.

내가 알던 정보
1. TRUNCATE 는 테이블을 비워준다.
2. TRUNCATE 도 데이터 제약을 신경써서 삭제한다.
3. DELETE 나 TRUNCATE 나 속도 차이는 없다.

새로 알게된 정보
1. TRUNCATE 는 그냥 테이블을 비워준다. 가 아니라 DROP 후 CREATE 한다.
2. 위와 같은 이유로 외래키의 제약을 무시하고 작업을 수행한다.
3. TRUNCATE 는 원자성을 보호받지 못한다.
4. TRUNCATE 를 삭제할 때 누군가 테이블을 사용 중 이라면 LOCK으로 인해 오류가 발생한다.
5. DELETE 는 롤백도 되고, 하나하나 세밀하게 데이터를 삭제할 수 있으며, 제약도 신경써서 삭제한다.
6. 두개의 속도는 확실하게 차이가 난다.

profile
배우노라, 실험하노라, 기록하노라

1개의 댓글

comment-user-thumbnail
2025년 3월 19일
  • 추가로 알게 된 사실 실무에는 거의 쓸일이 없지만,
    만약 진짜로 써야하고 치명적인 상황일 경우 모든 사원이 해당 작업을 실행하는 걸 알아야 한다.
답글 달기