나는 삭제만 하면 되는데...괜히 고민되게 삭제 하는 방법이 여러가지일까?
당연히 이유가 있다.
0. 삭제 하는 방법이 왜 여러가지 일까?
- Oracle에서는 해당 Data나 Table을 삭제할 때 위의 3가지 방식을 지원한다.
- 3가지 방식이라고 말하는 만큼 사용하는 용도나 목적에 따라 선택적으로 사용해야 하는데,
어떤 차이가 있는지 알아보면 상황에 따라 내가 사용해야 하는 sql문도 달라질거라 생각한다.
1. delete
- 아래와 같이 sql문을 작성할 수 있고, 괄호가 포함된 from 은 생략할 수 있다.
# user_table 내 특정 조건에 해당하는 row 삭제
delete (from) user_table where user_stat = 100;
rollback;
# user_table 전체 삭제
delete (from) user_table;
commit;
- data를 row 단위로 삭제 하는 가장 흔한 방법이고 익숙한 방법이다.
- 운용중인 DB라면 대부분의 경우, select, update, delete 같은 DML문이 사용된다.
- where절을(조건) 이용할 수 있는 만큼 전체중 일부를 지울 수 있기 때문에
실제 DB 상에서도 흔히 발생하는 DML문 중 하나이다.
- delete를 row 단위로 진행하며, commit을 자동으로 진행하지 않기 때문에
delete를 실행했더라도 아직 commit을 하지 않았다면, 실수를 인지하는 순간 복구(rollback)도 가능하다.
- 하지만 where 절 없이 table 전체를 delete를 진행해도 삭제를 하는 방식은
기존과 같이 oracle 내에서는 한줄씩 지워나간다.
- 한줄씩 지워나가는 작업방식이라는 방법과 어감에서 느낄수 있는 것처럼 속도가 느리다.
- 한줄로 요약하면,
특정 조건에 맞는 data를 일부 또는 전체 삭제할 때 사용하며,
전체도 사용은 가능하나 실제 삭제하는데는 부적합하다.
=> 이럴 땐 아래의 truncate를 사용한다.
2. truncate
truncate table user_table;
-- 복구가 불가하고 일부를 삭제할 수 없다. 대신 빠르게 처리한다.
-- 껍데기(table 구조)는 남겨두기 때문에 해당 sql문을 실행한 뒤 select 문을 실행하면
-- 0건의 row가 발생한다.(자료 없음)
- 운용 중인 DB라면 해당 sql문을 사용해본 적이 거의 없을 거라 생각한다.
- 보통 queue 테이블 용도로 사용하는 테이블의 데이터를 일괄로 지우는 등
특수한 상황에 사용한다.
- truncate는 기존 table 구조는 유지하고 해당 table에 있는 전체 row를 삭제한다.
- delete 처럼 where절을 지정할 수 없다.
- 이전의 data는 다 사라지고 처음 table을 만들었다고 생각해도 되는 상태가 truncate이다.
- 게다가 한번 실행하면 되돌릴 수 없다.(commit이 자동으로 수행된다.)
- 하지만 해당 table의 data가 실제 지워야 하는 data가 맞다면 truncate는 delete보다 빠르다.
- 되돌릴 수 없다는 것과 빠른것을 연관지어 보면, delete는 되돌릴 수 있기 때문에
rollback이 가능한 상태를 기록하며 삭제하는 동작이 추가되어 느린 것이고
truncate(이후 나올 drop)은 복구를 신경쓰지 않기 때문에 삭제 작업만 처리한다.
- 한 줄 요약 : 복구가 불필요한 전체 data를 빠른시간에 삭제하고자 할 때 사용한다.
+ 잊지말자. 되돌릴 수 없다. truncate를 쳐야한다면 두번, 세번 고민후 실행하자!!
3. drop
drop table user_table;
-- 빠르게 삭제한다. 복구가 불가하다.
-- table 자체를 날려버리기 때문에 해당 구문을 실행후 select 문으로 조회하면 table을 찾을 수 없다고 나타난다.
- 사용 빈도를 따지자면 3가지 sql문 중 가장 낮은 sql문이 될 것이다.
- truncate 와의 차이점은 table 자체를 삭제한다는 것이다.
- 그리고 뒤도 없다.
(drop 후에는 복구할 수 없다....재생성만 있을 뿐....그런데 같은 구조로 재생성을 해야한다면 drop 보다는 truncate가 더 적합하지 않았을까??)
- 아무튼, 완전히 삭제하고자 할 때 진행하며,
해당 구문을 진행한 뒤 select문을 실행하면 table 자체가 없다는 error 메세지가 발생한다.
전체 요약
DELETE | TRUNCATE | DROP | |
종류 | DML | DDL | DDL |
속도 | 느림 | 빠름 | 빠름 |
Commit | 미포함. 사용자가 추가 진행 | 포함 | 포함 |
Rollback | 가능(Commit 진행 하지 않았을 때만) | 불가 | 불가 |
삭제 가능 범위 | 특정 row ~ 전체 row | only 전체 row | table + 전체 row |
실행 후 select 문 | 삭제된 row를 제외한 data 검색(select) 가능 |
0건으로 검색됨 | Error (해당 table 없음) |