티스토리 뷰
🚀 들어가며...
- 금일 포스팅에서는 SQL에서 흔히 쓰는 DROP, TRUNCATE, DELETE의 차이점들을 알아보겠습니다!
📑 내용
차이점을 서술하기에 앞서 각각의 명령어의 특징을 알아보겠습니다.
1) DELETE
- WHERE절을 사용하여 테이블에 있는 데이터를 하나하나 선택하여 제거하는 방식
- WHERE절을 사용하지않고 테이블의 모든 데이터를 삭제하더라도, 내부적으로는 한줄 한줄 일일히 제거하는 과정을 거칩니다.
- 처리속도가 늦고, 퍼포먼스에 좋지않은 영향을 줄 수 있습니다.
- 원하는 데이터만 골라서 삭제할 때에는 DELETE 사용 / 전체 데이터 삭제할 때에는 TRUNCATE 사용합니다.
- 데이터를 삭제하더라도 데이터가 담겨있던 Storage는 Release 되지 않습니다.
- DELETE된 데이터는 COMMIT 명령어를 사용하기 전이라면, ROLLBACK 명령어를 통해 되돌릴 수 있습니다.
DELETE FROM dbtable;
DELETE FROM dbtable WHERE {조건};
ROLLBACK;
COMMIT;
2) TRUNCATE
- 전체 데이터를 한번에 삭제하는 방식 ( <-> DELETE)
- 최초 생성되었을 당시의 Storage만 남기고, 데이터가 남겨있던 Storage는 Release 됩니다.
- TRUNCATE TABLE을 하면 CREATE TABLE을 한 직후의 상태와 같습니다.
- 자동 COMMIT이 되는 명령어이기 때문에, 이미 지운 데이터는 되돌릴 수 없습니다.
TRUNCATE TABLE dbtable;
3) DROP
- 테이블 자체를 완전히 날려버리는 방식입니다. (처음부터 없었던 테이블처럼)
- 테이블 자체가 모두 지워지며, 해당 테이블에 생성되어있던 모든 인덱스도 사라집니다.
- 자동 COMMIT이 되는 명령어이기 때문에, 이미 지운 데이터는 되돌릴 수 없습니다.
- 오라클에서(오라클10g부터)는 테이블이 삭제되는 것이 아니라 윈도우의 휴지통 개념처럼 잠시 삭제 -> 테이블 이름이 BIN$..로 변경됩니다.
DROP TABLE dbtable;
한눈에 알아보기 쉽게 표로 정리해 보았습니다. 😀
DROP | TRUNCATE | DELETE | |
종류 | DDL | DDL (일부 DML 성격) | DML |
COMMIT | AUTO COMMIT | AUTO COMMIT | 사용자 COMMIT |
ROLLBACK | 불가능 | 불가능 | COMMIT 이전에 가능 |
Storage | Storage 삭제 (테이블 스키마 삭제) | 최초 테이블 생성 시 할당된 Storage만 남기고 삭제 (테이블 스키마 유지) | 데이터 모두 DELETE 해도 Storage 삭제X |
수행 시 | 테이블 정의 자체 삭제 | 테이블을 최소 생성된 초기 상태로 만듬 | 데이터만 삭제 |
사용 예제 | DROP TABLE STUDENT; | TRUNCATE TABLE STUDENT; | DELETE FROM STUDENT; |
로그 | 안남김 | 안남김 | 남김 |
속도 | 빠름 | 빠름 | 느림 |
DELETE에 조건(Where)이 없으면 TRUNCATE와 동일하게 모든 데이터가 삭제되고 테이블 스키마만 남는 빈 껍데기 형태가 됩니다.
그러면 속도가 빠른 TRUNCATE 쓰는게 좋겠네? 라고 생각하기 쉽지만
DELETE 명령어는 데이터 복구가 가능하고, 로그를 남기므로, 중점을 어디에 두느냐에 따라 다르게 사용될 수 있습니다.
🙋🏻♂️ 정리
- DELETE 명령어는 데이터는 지워지지만 테이블 용량은 줄어 들지 않습니다. 원하는 데이터만 지울 수 있습니다. 삭제 후 잘못 삭제한 것을 되돌릴 수 있습니다.
- TRUNCATE 명령어는 용량이 줄어 들고, 인덱스 등도 모두 삭제 됩니다. 테이블은 삭제하지는 않고, 데이터만 삭제한다. 한꺼번에 다 지워야 합니다. 삭제 후 절대 되돌릴 수 없습니다.
- DROP 명령어는 데이블 전체를 삭제, 공간, 객체를 삭제합니다. 삭제 후 절대 되돌릴 수 없습니다.
🔗 참고한 글
'Postgresql' 카테고리의 다른 글
[Postgresql] 쿼리 속도개선 방법 정리 (0) | 2022.11.17 |
---|---|
[Postgresql] 날짜데이터 가지고 요일 찾는 방법(to_char) (2) | 2022.10.05 |
[DB] Redis란?? (0) | 2022.08.23 |
[Postgresql] 인덱스와 시퀀스의 차이 (0) | 2022.08.11 |
[Postgresql] Psycopg2란? 트랜잭션 ID 추출방법은? (0) | 2022.08.09 |
- Total
- Today
- Yesterday
- react
- Python
- This
- Greedy Algorithm
- static files
- docker
- Default export
- Linux
- django ORM
- Named export
- lv1
- union-find
- programmers
- uSWGI
- 탐욕법
- Master & Slave
- generator expression
- SQL
- django
- JavaScript
- list
- PostgreSQL
- lv2
- data formatting
- MVT
- db
- Algorithm
- ORM
- JS
- container
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |