MySQL의 DDL중에는 DML의 DELETE 명령어와 비슷한 기능을 하지만 사실은 전혀 다른 TRUNCATE 명령어가 존재한다.
그렇다면 이 두가지 명령어는 어떠한 공통점과 차이점을 가지는지 비교해 보도록 하자.
먼저 공통점에 대해서 살펴보자.
이 두 SQL문을 실행하고 해당 테이블의 데이터를 조회할 경우 결과는 같게 나타날 것이다.
다음은 이 두 SQL문을 실행해보자. 이번에도 결과가 같은지 살펴보자. 결과는 다르게 나타날 것이다.
DELETE 명령어와 TRUNCATE 명령어의 공통점은 해당 테이블의 데이터를 삭제한다는 것이다. 하지만 두번째 예시를 보면 알 수 있듯이
항상 똑같이 작동하는 것은 아니다. 예시에서와 같이 DELETE 명령어는 뒤에 WHERE절을 통해 조건을 부여할 수 있다.
TRUNCATE은 조건절의 부여없이 테이블의 데이터를 모두 삭제하는 명령어이며, DELETE는 모든 데이터를 삭제하거나 조건절 부여를
통한 일부 데이터를 삭제하는 명령어이다.
우리는 두가지 예시를 통해 두 명령어간의 차이점을 쉽게 확인할 수 있었다. 하지만 두 명령어간의 차이점은 이것만 존재할까.
사실 DELETE와 TRUNCATE의 가장 큰 차이점은 데이터를 삭제하는 방식이다.
DELETE의 경우 데이터를 한줄씩 순차적으로 삭제하고 TRUNCATE은 테이블 DROP 후 CREATE를 수행한다.
이는 두 명령어 간의 목적차이로 발생하는 차이인데, DELETE는 해당 데이터를 삭제하고 삭제한 공간을 재사용하기 위한 명령어이고
TRUNCATE은 테이블 명세만을 남기고 데이터가 존재하던 공간마저 제거하기 위한 명령어이다.
두 명령어 중 속도는 TRUNCATE가 더 빠르지만 복구가 불가능하다는 제한사항 또한 존재한다.
또다른 TRUNCATE의 특징으로는 다음과 같은 것들이 존재한다.
기존에 AUTO_INCREMENT로 지정하여 값이 증가하던 컬럼이 초기화 된다.(5.0.13 버전부터)
[테이블명].frm 파일이 유효할 경우, 데이터나 인덱스가 손상된 경우라도 빈 테이블로 재생성이 가능하다.
간단하게나마 DELETE와 TRUNCATE의 차이점을 살펴보았다.
위에서 서술한 내용들을 참고하여 DELETE와 TRUNCATE을 때에따라 적절하게 사용토록 하자.
그렇다면 이 두가지 명령어는 어떠한 공통점과 차이점을 가지는지 비교해 보도록 하자.
먼저 공통점에 대해서 살펴보자.
DELETE FROM TEST;
TRUNCATE TABLE TEST;
이 두 SQL문을 실행하고 해당 테이블의 데이터를 조회할 경우 결과는 같게 나타날 것이다.
DELETE FROM TEST WHERE name='짜짜로니';
TRUNCATE TABLE TEST;
다음은 이 두 SQL문을 실행해보자. 이번에도 결과가 같은지 살펴보자. 결과는 다르게 나타날 것이다.
DELETE 명령어와 TRUNCATE 명령어의 공통점은 해당 테이블의 데이터를 삭제한다는 것이다. 하지만 두번째 예시를 보면 알 수 있듯이
항상 똑같이 작동하는 것은 아니다. 예시에서와 같이 DELETE 명령어는 뒤에 WHERE절을 통해 조건을 부여할 수 있다.
TRUNCATE은 조건절의 부여없이 테이블의 데이터를 모두 삭제하는 명령어이며, DELETE는 모든 데이터를 삭제하거나 조건절 부여를
통한 일부 데이터를 삭제하는 명령어이다.
우리는 두가지 예시를 통해 두 명령어간의 차이점을 쉽게 확인할 수 있었다. 하지만 두 명령어간의 차이점은 이것만 존재할까.
사실 DELETE와 TRUNCATE의 가장 큰 차이점은 데이터를 삭제하는 방식이다.
DELETE의 경우 데이터를 한줄씩 순차적으로 삭제하고 TRUNCATE은 테이블 DROP 후 CREATE를 수행한다.
이는 두 명령어 간의 목적차이로 발생하는 차이인데, DELETE는 해당 데이터를 삭제하고 삭제한 공간을 재사용하기 위한 명령어이고
TRUNCATE은 테이블 명세만을 남기고 데이터가 존재하던 공간마저 제거하기 위한 명령어이다.
두 명령어 중 속도는 TRUNCATE가 더 빠르지만 복구가 불가능하다는 제한사항 또한 존재한다.
또다른 TRUNCATE의 특징으로는 다음과 같은 것들이 존재한다.
기존에 AUTO_INCREMENT로 지정하여 값이 증가하던 컬럼이 초기화 된다.(5.0.13 버전부터)
[테이블명].frm 파일이 유효할 경우, 데이터나 인덱스가 손상된 경우라도 빈 테이블로 재생성이 가능하다.
간단하게나마 DELETE와 TRUNCATE의 차이점을 살펴보았다.
위에서 서술한 내용들을 참고하여 DELETE와 TRUNCATE을 때에따라 적절하게 사용토록 하자.
'DB' 카테고리의 다른 글
[DB] MySQL - autoReconnect=true (0) | 2011.09.09 |
---|---|
[DB] MySQL - DATABASE별 현재 테이블 용량 구하는 쿼리 (0) | 2011.08.31 |
[DB] MySQL - 권한 할당 및 해제[GRANT/REVOKE] (0) | 2011.06.07 |
[DB] Oracle - INDEX 에서의 PCTFREE와 PCTUSED (0) | 2011.04.26 |
[DB] Oracle - Bitmap INDEX (0) | 2011.04.24 |