[PostgreSQL] drop, delete, truncate의 차이점

1. DROP 명령어
개념 : 테이블 자체를 삭제하는 명령어
설명
- 해당 테이블 자체가 삭제된다.
- 해당 테이블에 생성되어있던 인덱스, 제약조건 등도 삭제된다.
- 삭제 후 되돌릴 수 없다.
- DROP TABLE [테이블명]
2. TRUNCATE 명령어
개념 : 테이블의 데이터를 전부 삭제하고 사용하고 있던 공간을 반납하는 명령어
설명
- 해당 테이블의 데이터만 모두 삭제되며 테이블 자체가 삭제되는 것은 아니다.
- 해당 테이블에 생성되어있던 인덱스도 함께 삭제된다.
- 조건을 걸지 못해 데이터를 한꺼번에 다 지운다.
- 삭제 후 되돌릴 수 없다.
- DDL이다.
- TRUNCATE TABLE [테이블명]
3. DELETE 명령어
개념 : 테이블의 조건이 맞는 데이터를 삭제한다.
설명
- 데이터만 지워지고 사용하고 있는 디스크 상의 공간은 그대로 가지고 있다.
- 삭제 후 되돌릴 수 있다.
- DML이다.
- DELETE FROM [테이블명] WHERE [조건절]
(WHERE이 없어도 되지만 항상 데이터를 지울때는 where을 먼저 적어서 신중히 없애는 습관을 가지는 것도 좋은 것 같다.)
4. DELETE문과 비교하여 TRUNCATE TABLE의 이점
A. 트랜잭션 로그 공간을 덜 사용한다.
- DELETE문은 행을 한번에 하나씩 제거하고 삭제된 각 행에 대해 트랜잭션 로그에 항목을 기록한다.
- TRUNCATE문은 테이블의 데이터를 저장하는데 사용되는 데이터 페이지의 할당을 취소하는 방식으로 데이터를 제거하며 페이지 할당 취소만을 트랜잭션 로그에 기록한다.
B. 일반적으로 적은 수의 잠금이 사용된다.
- 행 잠금(Lock)을 사용하여 DELETE문을 실행하면 삭제를 위해 데이블의 각 행이 잠긴다.
- TRUNCATE문은 항상 테이블(스키마 잠금 포함)과 페이지를 잠그지만 각 행은 잠그지 않는다.
* Lock이란? 트랜잭션 무결성 및 데이터베이스 일관성을 유지하기 위한 방법으로 다른 사용자가 변경 중인 데이터를 읽을 수 없게 하며 여러 사용자가 동시에 같은 데이터를 변경할 수 없게 한다.