본문 바로가기
ORACLE/SQL

[Oracle] 오라클 DELETE, TRUNCATE 차이(HIGH WATER MARK) :: 마이자몽

by 마이자몽 🌻♚ 2020. 3. 23.

오라클에서는 데이터를 삭제하는 명령어로 DELETE, TRUNCATE, DROP 이 있습니다. DROP의 경우 테이블의 데이터까지 전부삭제를 해주고 DELETE와 TRUNCATE은 테이블을 남기고 데이터만 삭제합니다.

 

 

DELETE와 TRUNCATE 차이

 

DML과 DDL

DELETE와 TRUNCATE의 가장 큰 차이는 DML과 DDL이라는 것입니다. DDL의 경우 하나의 명령이 트랜잭션의 시작과 끝이기 때문에 바로 반영이 되어버립니다. 그래서 TRUNCATE은 ROLLBACK이 불가능한 반면 DELETE은 DML 명령어이므로 TRANSACTION 단위로 ROLLBACK과 COMMIT이 가능합니다.

 

 

저장공간 반납과 유지

EMP 테이블에서 192번사원을 찾는다고 가정해봅니다. SQL 명령 순서에 의해서 FROM절이 가장 먼저 실행됩니다. 그러면 테이블이 위치해있는 TABLESPACE에 해당 테이블의 BLOCK을 찾아갑니다. 이때  EMP 테이블의 데이터 수에 따라 BLOCK의 수도 유동적으로 변하지 않습니다. 예를 들어 100개의 블록이 있다고 하면 EMP테이블 데이터와 빈 블록이 함께 공존할 수 있다는 얘기 입니다. 그렇다면 EMP 테이블의 데이터가 읽기 위해 어떤 처리과정이 진행될까요?

 

 

High Water Mark

테이블 SEGMENT의 첫번째 HEADER BLOCK에는 테이블에 대한 정보가 있습니다. 그중에서 HIGH WATER MARK라는 정보가 있습니다. 이는 강의 최고수위를 측정하는 것과 비슷한 원리 입니다.

 

1년중 최고수위는 최고 기록을 갱신하지 않는한 변하지 않습니다. 이전 최고 수위보다 높은 수위를 기록하면 값이 갱신되고 그전까지는 그대로 최고기록이 남습니다. 그래서 1년중에는 최고수위가 낮아지지 않고 높아지기만 합니다.

 

ORACLE의 HIGH WATER MARK도 마찬가지입니다. 데이터를 계속해서 넣으면 HIGH WATER MARK는 계속 높아집니다.

 

DELETE : 데이터를 삭제해도 HIGH WATER MARK는 그대로

TRUNCATE : 데이터를 삭제하면 HIGH WATER MARK 해제

 

즉, DELETE로 100만건을 삭제해서 1건의 데이터만 남아도 테이블을 조회할때는 100만건 전체를 조회할떄랑 속도차이가 없습니다. 반면, TRUNCATE은 HIGH WATER MARK를 해제해주기 때문에 대량의 데이터를 삭제했을 때 차이를 볼 수 있습니다.

 

태그

댓글0