[SQL] DELETE FROM vs TRUNCATE

sql

목록 보기
4/6

테이블의 데이터를 삭제하는 명령어를 찾아보면 어떤 경우는 DELETE 를 사용하는 경우도 있고, 어떠한 경우엔 TRUNCATE 를 사용하는 경우가 있는 것을 본적이 있다.

이 둘이 어떠한 점이 다르고 어떠한 상황에 사용하는게 더 적절한 것인지 간략하게 알아보자.


DELETE FROM table-name

  • WHERE 절을 사용하여 조건에 맞는 행을 하나하나 삭제할 수 있다.
  • WHRER 절을 사용하지 않고 모든 행을 삭제할 수 있다.
  • WHERE 절 사용유무와는 별개로 DELETE는 한줄 한줄 레코드를 읽어 삭제하는 방식이므로 처리속도가 늦고, 퍼포먼스에서 좋지 않은 영향을 줄 수 있다.
  • 또한 데이터를 삭제하더라도 테이블의 용량은 줄어들지 않는다.
  • DELETE된 데이터는 COMMIT 명령어를 사용하기 이전이라면 ROLLBACK 명령어를 통해 되돌릴 수 있다.

위와 같은 특징에서 볼 수 있듯 DELETE는 테이블 내의 행을 하나하나 읽고 삭제하기 때문에 데이터를 삭제할 때마다 트랜잭션 로그를 생성하고, 롤백이 가능해야 하기 때문에 비교적 느릴 수 있다.

DELETE FROM table;

DELETE FROM table WHERE "조건";

ROLLBACK;
COMMIT;

TRUNCATE table-name

  • 전체 데이터를 한번에 삭제하는 방식.
  • 최초 생성되었을 때 할당된 Storage 만 남기고, 데이터가 담겨있던 Storage는 날려버린다.
  • TRUNCATE를 하게되면 초기 CREATE TABLE 만 실행했을 때와 같은 상태이다.
  • 자동적으로 COMMIT 되기 때문에, ROLLBACK 이 불가능하다 즉 되돌릴 수 없다.

데이터 전체를 삭제하는 명령어로, 삭제하게 될경우 용량도 줄어들고, 인덱스 등도 모두 삭제가 되어 초기상태로 돌릴 때 사용한다.
테이블의 형태는 그대로 두고 데이터만 날려버리고 싶을때 사용하고 이는 바로 COMMIT 되기 때문에 트랜잭션 로그를 생성하지도 않고, 롤백도 불가능하기 때문에 비교적 빠른 속도로 데이터를 삭제할 수 있다.

TRUNCATE TABLE table;

DROP table-name

  • 테이블 자체를 완전히 날려버리는 방식, 즉 아예 테이블을 없앰
  • 테이블이 사라지면서 해당 테이블에 생성되어 있었던 인덱스도 사라진다.
  • 자동적으로 COMMIT 되는 명령어 이기 때문에 마찬가지로 되돌릴 수 없다.

테이블 전체를 삭제하는 방법으로 테이블의 저장공간,인덱스 등을 모두 삭제하고 되돌릴 수 없는 상태로 만든다.


이렇게 비슷하면서도 다른 삭제 명령어에 대해서 간략하게 알아보았다.

profile
살아남기 위해 끄적이는 블로그 : 생존법

0개의 댓글