검색결과 리스트
글
하지만 같은기능을 두개의 명령어로 사용할 필요는 없겠죠?
그래서 두 명령어의 차이점에 대해 알아보겠습니다.
TRUNCATE는 DDL, DELETE 는 DML 입니다.
DDL(Data Definition Language)은 데이터를 정의하는 언어로서 개체를 만들고 변경, 삭제하는 CREATE, ALTER, DROP문과 같은 것들을 말합니다.
DML(Data Manipulation Language)은 데이터 조작 언어로서 데이터를 가공하는 SELECT, INSERT, UPDATE, DELETE문과 같은 것들을 말합니다
구문은 다음과 같습니다.
[TRUNCATE 구문]
[DELETE 구문]
[ WITH <common_table_expression> [ ,...n ] ]
DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] { <object> | rowset_function_limited [ WITH ( <table_hint_limited> [ ...n ] ) ] }
[ <OUTPUT Clause> ]
[ FROM <table_source> [ ,...n ] ]
[ WHERE { <search_condition> | { [ CURRENT OF { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ]
[ OPTION ( <Query Hint> [ ,...n ] ) ] [; ]
<object> ::=
{ [ server_name.database_name.schema_name. | database_name. [ schema_name ] . | schema_name. ] table_or_view_name }
구문만 보더라도 TRUNCATE는 DELETE보다 간단한걸 볼 수 있습니다.
간단하다는 말은 TRUNCATE는 단순한 조건일 것이고 DELETE는 다양한 조건이 가능하다고 추측할 수 있습니다.
그럼 MSDN에서 두 명령어에 대해 비교해놓은 내용을 참고로 보겠습니다.
DELETE 문과 비교하여 TRUNCATE TABLE에는 다음과 같은 이점이 있습니다.
- 트랜잭션 로그 공간을 덜 사용합니다.
DELETE 문은 행을 한번에 하나씩 제거하고 삭제된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다. 반면 TRUNCATE TABLE은 테이블의 데이터를 저장하는 데 사용되는 데이터 페이지의 할당을 취소하는 방식으로 데이터를 제거하며 페이지 할당 취소만을 트랜잭션 로그에 기록합니다. - 일반적으로 적은 수의 잠금이 사용됩니다.
행 잠금을 사용하여 DELETE 문을 실행하면 삭제를 위해 테이블의 각 행이 잠깁니다. TRUNCATE TABLE은 항상 테이블과 페이지를 잠그지만 각 행은 잠그지 않습니다. - 빈 페이지는 예외 없이 테이블에 남습니다.
DELETE 문이 실행된 후에도 테이블은 계속 빈 페이지를 포함할 수 있습니다. 예를 들어 힙의 빈 페이지는 최소한 배타적인(LCK_M_X) 테이블 잠금이 있어야만 할당 취소할 수 있으므로 삭제를 위해 테이블 잠금을 사용하지 않는 경우 테이블(힙)에는 빈 페이지가 많이 남게 됩니다. 인덱스의 경우도 삭제 작업 후에 빈 페이지가 남을 수 있지만 이러한 페이지는 백그라운드 정리 프로세스에 의해 신속하게 할당 취소됩니다.
TRUNCATE TABLE은 테이블에서 모든 행을 제거하지만 테이블 구조와 테이블의 열, 제약 조건, 인덱스 등은 그대로 남습니다. 테이블 정의 및 테이블의 데이터를 제거하려면 DROP TABLE 문을 사용하십시오.
테이블에 ID 열이 포함되어 있으면 해당 열의 카운터는 열에 대한 초기값으로 다시 설정됩니다. 초기값이 정의되어 있지 않으면 기본값인 1이 사용됩니다. ID 카운터를 보존하려면 DELETE를 대신 사용하십시오.
친절하게도 MSDN에 자세하게 설명이 되어있군요 글을 읽어보면 금방 이해가 될것이라 생각이 듭니다.
여기서 마지막 내용으로 예제를 만들어 보도록 하겠습니다.
먼저 테이블을 생성하도록 하겠습니다.
CREATETABLETABLENAME
(A INTIDENTITY,B INT)
자동증가값을 가지는 A 컬럼, 정수형의 B 컬럼이 있는 TABLENAME이라는 테이블을 생성하였습니다.
INSERTINTOTABLENAME VALUES(1)
INSERTINTOTABLENAME VALUES(2)
INSERTINTOTABLENAME VALUES(3)
입력 결과를 확인해 보겠습니다.
SELECT*FROMTABLENAME
A B
----------- -----------
1 1
2 2
3 3
DELETE문을 이용해서 전체를 삭제후 다시 입력을 해보겠습니다.
DELETEFROMTABLENAME
INSERTINTOTABLENAME VALUES(4)
INSERTINTOTABLENAME VALUES(5)
INSERTINTOTABLENAME VALUES(6)
처리된 결과를 확인해 보겠습니다.
SELECT*FROMTABLENAME
A B
----------- -----------
4 4
5 5
6 6
(3개 행 적용됨)
전체 삭제후 새롭게 입력을 했을때 자동증값은 삭제된 항목의 최대값 다음의 증가값으로 입력된걸 확인할 수 있습니다.
이번엔 TRUNCATE문을 이용해서 삭제후 다시 입력을 해보겠습니다.
TRUNCATETABLETABLENAME
INSERTINTOTABLENAME VALUES(7)
INSERTINTOTABLENAME VALUES(8)
INSERTINTOTABLENAME VALUES(9)
처리된 결과를 확인해 보겠습니다.
SELECT*FROMTABLENAME
A B
----------- -----------
1 7
2 8
3 9
(3개 행 적용됨)
자동증가값이 초기값이 되고나서 증가되었음을 확인할 수 있습니다.
이제 이해가 좀 쉽게되시죠? ^^
하지만 TRUNCATE문의 단점도 있습니다.
DELETE문은 WHERE절을 이용하여 조건을 사용할 수 있지만 TRUNCATE는 조건을 사용할 수 없습니다.
그리고 DDL이기 때문에 사용권한 문제도 있습니다.(아래는 MSDN에 있는 사용권한 내용입니다.)
최소한table_name에대한 ALTER 권한이필요합니다. TRUNCATE TABLE 권한은테이블소유자, sysadmin고정서버역할및db_owner및db_ddladmin고정데이터베이스역할의기본권한이며위임할수없습니다. 하지만저장프로시저와같은모듈내에 TRUNCATE TABLE 문을통합한뒤 EXECUTE AS 절을사용하여적절한권한을모듈에허용할수있습니다. 자세한내용은EXECUTE AS를사용하여사용자지정권한집합만들기를참조하십시오
TRUNCATE를 사용하기위한 제한 사항들도 있습니다.(아래는 MSDN에 있는 제한사항 내용입니다.)
다음과같은테이블에서는 TRUNCATE TABLE 문을사용할수없습니다.
- FOREIGN KEY 제약조건에의해참조됩니다. 자신을참조하는외래키가있는테이블을잘라낼수있습니다.
- 인덱싱된뷰에참여합니다.
- 트랜잭션복제또는병합복제에의해게시됩니다.
이런특징을한개이상갖고있는테이블의경우 DELETE 문을대신사용하십시오.
TRUNCATE TABLE은개별행삭제를기록하지않기때문에트리거를실행할수없습니다. 자세한내용은CREATE TRIGGER(Transact-SQL)를참조하십시오.
어느게 좋다 나쁘다 이런문제가 아닙니다. 사용목적에 따라 적절하게 사용하시는게 최선이라고 생각합니다.
MSDN참조 경로 : (http://msdn.microsoft.com/ko-kr/library/ms177570.aspx)
출처 : http://pointnet.tistory.com/334
'-- MSSQL' 카테고리의 다른 글
특정테이블을 날렸을 때 복구방법 (0) | 2009.06.19 |
---|---|
SQL Server 2000 Wait Types (0) | 2009.06.19 |
SQL Injection (SQL 인젝션)에 대한 보안 (0) | 2009.06.17 |
Sql Injection 침해 흔적을 통한 보안점검 (0) | 2009.06.17 |
dtexec 유틸리티 - SQL Server 2005 온라인 설명서 (0) | 2009.06.17 |
RECENT COMMENT