Pages

2014년 2월 21일 금요일

[ORACLE] DELETE와 TRUNCATE의 차이점

DELETE와 TRUNCATE TABLE의 차이는 어떻게 삭제 작업이 처리되는지에 있다.

DELETE는 삭제 작업을 처리하기 위해 해당되는 범위를 선택한 후 실제 데이터 및 인덱스 페이지를 찾아내어 삭제한다.

truncate는 페이지를 삭제하는 것이 아니라, 페이지를 관리하는 별도의 할당 페이지에 해당 페이지들에 다음 할당이 가능하다는 표시를 한다. 즉, 이 페이지는 새로운 인서트 작업을 위해서 사용할 수 있다고 표시를 해 놓는 것이다.

이렇기 때문에 TRUNCATE가 DELETE보다 속도가 빠르다.

이 작업은 디스크의 완전 포맷명령과 빠른 포맷의 차이와 비슷하다.
DELETE로 삭제한 데이터는 로그를 사용해서 복구가 가능하고, TRUNCATE로 삭제된 데이터는 해당 데이터 페이지가 덮어쓰여지지 않았다면 복구가 가능하다.

TRUNCATE는 identity컬럼을 초기화 시킨다. 이 컬럼의 카운트를 보존해야 한다면 DELETE를 사용해서 삭제하길 바란다.

또, TRUNCATE는 로그를 사용하지 않는 명령어이다. 로그를 남기지 않으므로 아래와 같은 경우에는 사용할 수 없다.
- 다른테이블에서 참조되는 경우
- 트리거가 설정되어 있는 경우
- 복제작업(Replication)에 참여하고 있는 경우
- Index View에 참여하고 있는 테이블

일단, 복제작업, 트리거 같은 경우는 로그를 보고 작업되는 내용이므로 사용할 수 없다는건 이해가 간다.
복제작업 같은 경우는 테이블을 똑같은 내용으로 백업해놓는 작업이라고 보면 되는데 전체 데이터를 스캔해서 복제하게되면 너무 부하가 크기 때문에 해당 테이블의 작업 로그(insert, delete, update된 기록)을 보고 해당 기록과 동일하게 복제테이블에도 작업을 해주는 방식으로도 관리가 된다. 
트리거도 해당 테이블의 insert, delete, update되었을때 해당 로그를 보고 작업을 하기 때문에 TRUNCATE를 사용하면 안된다는 것이다.

다른테이블에서 참조되는 경우, Index View에 참여하고 있는 테이블은 더 공부를 해봐야 할 내용인듯 하다.

댓글 없음:

댓글 쓰기