본문 바로가기
IT 배우기/Oracle

[SQL / Oracle] DELETE / TRUNCATE / DROP 차이

by To올라운더 2023. 10. 28.
반응형

나는 삭제만 하면 되는데...괜히 고민되게 삭제 하는 방법이 여러가지일까?

당연히 이유가 있다. 

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 없음)

 

반응형