Database/RDBMS

[MSSQL] TRUNCATE vs DELETE 차이점

JeongKyun 2021. 11. 23.

실무에서도 두 개의 차이를 대강 알고 사용했었지만 요번 SQLD를 준비하면서 위의 내용으로 문제를 하두 풀다보니 이제 두개의 차이점을 명확히 알겠다. 이렇게 기억하고 있을 때 메모해놓기 위해 글을 작성한다.

 

 

1. TRUNCATE

 

1-1. Truncate 특징

1) DDL 명령어이다.

2) 모든 레코드(행)를 삭제해버리는 특징이 있다.

3) 조건절 사용을 못한다 (where절 사용 불가)

4) IDENTITY를 초기화 할 수 있다.

5) 테이블 구조, 열, 제약조건, 인덱스는 그대로 남는다.

6) 트랜잭션 로그 공간을 덜 사용한다.

> delete문은 행을 한번에 하나씩 제거하고 삭제된 각 행에 대해 트랜잭션 로그를 기록하게 된다.

그에 반해 truncate는 해당 테이블의 데이터 저장소의 페이지를 취소하는 방식으로 데이터를 제거하고 페이지 할당 취소만을 트랜잭션에 넣기 때문에 공간을 덜 사용한다.

7) Auto Commit이라서 한번 실행하면 복구 할 수 없다.

 

1-2. TRUNCATE의 사용구문

TRUNATE TABLE [테이블명]

 

추가로 IDENTITY는 고유ID값이나 이력 관련 부분에 있어서 키값을 매겨 자동 증가열을 사용하는 경우 사용된다.

보통 키값(PK)으로 사용되는 경우가 많으며 이 부분을 아래의 예제 처럼 (1,1)로 잡아놓는다면 해당 값은 1행마다 1씩 자동 증가가 되서 번호가 부여된다.

 

1-3. IDENTITY 예제

CREATE TABLE [dbo].[UserTable](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [name] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into UserTable (name) values( '안곰돌') -- identity의 속성으로 id는 입력 안해줘두 된다.
insert into UserTable (name) values( '김여우') -- 위와 동일
insert into UserTable (name) values( '족제비') -- 위와 동일
select * from UserTable

결과값)

조회 결과 값

 

위의 결과값을 보면 알 수 있듯 자동으로 1씩 증가 채번이 된다.

이제 이 자동 증가열 값이 적용되어있는 테이블에 Truncate를 사용하면 최종 설정 값을

초기화시켜 다시 1부터 시작된다고 보면 된다.

 

이제 Delete를 알아보자.

 

2. DELETE

 

2-1. Delete 특징

1) 조건(where)절을 사용하여 특정 행을 삭제할 수 있다.

2) identity값을 초기화 시키질 못한다.

> 만약 제약조건으로 인해 delete를 사용하게 됐을 때 자동증가열을 초기화 시키고 싶다면,

DBCC CHECKIDENT를 사용하여 초기화 해주면 된다. 

3) AutoCommit이 아니라서 Rollback을 이용해 삭제한 데이터를 살릴 수 있다.

 

2-2. DELETE의 사용구문

DELETE FROM [테이블명] --전체 행 삭제

-- OR

DELETE FROM [테이블명] WHERE [컬럼명] = [값] -- 조건절

2-3. DELETE 의 IDENTITY 예제

CREATE TABLE [dbo].[UserTable](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [name] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into UserTable (name) values( '안곰돌') -- identity의 속성으로 id는 입력 안해줘두 된다.
insert into UserTable (name) values( '김여우') -- 위와 동일
insert into UserTable (name) values( '족제비') -- 위와 동일
select * from UserTable

---조회값---
id name
1  안곰돌
2  김여우
3  족제비

delete from UserTable

---결과값---
id name
X  X  -- 값 없음.


---다시 Insert---
insert into UserTable (name) values( '안곰돌') -- identity의 속성으로 id는 입력 안해줘두 된다.
insert into UserTable (name) values( '김여우') -- 위와 동일
insert into UserTable (name) values( '족제비') -- 위와 동일
select * from UserTable

---조회값---
id name
4  안곰돌 --identity가 초기화 되지 않아 4부터 시작됨.
5  김여우 
6  족제비

위의 예제를 보면 delete의 identity가 초기화 안한다는 말이 무엇인지 이해가 갈것이다. 

 

결론

두 명령어의 차이는 뭐가 더 좋다 나쁘다가 아닌 쓰임새에 맞게 사용하면 된다.

truncate 테이블에 있는 전체 행을 삭제하고 identity값을 초기화 시키고 싶을 때 사용하면 된다.

delete는 조건절을 이용하여 삭제하고싶은 행이 있을 때 사용하면 되며 identity값과 관련 없을 때 사용하면 된다.

 

추가로 전체 행을 삭제해야되는 기능을 구현할 때면 삭제할때마다 해당 행을 트랜잭션

로그에 남기지 않는 TRUCATE가 속도가 더 빠르다.

반응형

댓글

💲 많이 본 글