안녕하세요. 비전팀 1기 강동운입니다.

 

TRUNCATE와 DELETE가 내부적으로 어떻게 작동하는지 살펴보도록 하겠습니다.

이와 관련해서 IAM, GAM, SGAM, PFS을 알고 계신다는 조건하에 설명드리겠습니다.

 

 

USE master

GO

IF DB_ID('EastLuckTest') IS NOT NULL

       DROP DATABASE EastLuckTest

GO

 

CREATE DATABASEEastLuckTest

GO

USE EastLuckTest

GO

 

CREATE TABLE DeleteTest

(

       IDX          INT          IDENTITY     NOT NULL

,      DATA   CHAR(8000)                 NOT NULL

)

GO

INSERT INTO DeleteTest(DATA) SELECT REPLICATE('A',8000)

GO 100

 

DBCC IND('EastLuckTest','DeleteTest',0)

GO

 

1_riverluck.png


 
테이블에 인덱스가 전혀 없으므로 모두 Leaf Level 입니다. 이 중 55번 Page에 데이터가 어떻게 들어가있는지 Internal Viewer를 통해 확인해보도록 하겠습니다.

2_riverluck.png

위에 처럼 데이터가 들어가 있는 것을 확인해 볼 수 있습니다.

여기서 TRUNCATE로 데이터를 날려본 후 55 페이지가 어떤 식으로 데이터가 들어있는지 한번 보도록 하겠습니다.

TRUNCATE TABLE DeleteTest


 4_riverluck.png


 
헉.. 달라진게 전혀 없습니다. 하지만 딱 하나 PFS의 상단 색상이 흰색으로 비어있습니다.
즉.. TRUNCATE로 지운다고 하더라도.. 각 페이지 내용까진 까진 싹 지우진 않는 다는 것이 확인되었습니다 ^^
실제로 각 Page에 할당 된 값들을 초기화를 시킨다면.. 테이블 사이즈가 클 수록 엄청 오래 걸리겠지요??

그럼 이제 데이터를 다시 100건 넣어 보도록 하겠습니다.

INSERT INTO DeleteTest(DATA) SELECT REPLICATE('A',8000)

GO 100

 

DBCC IND('EastLuckTest','DeleteTest',0)

GO


5_riverluck.png
페이지번호가 모두 바뀐 것 뺴고는 다를바가 없어 보입니다. 페이지 번호는 SQL Server가 PFS를 통해서 할당을 해줬겠지요~!
여기서 114번의 내용을 보도록 하겠습니다.

6_riverluck.png
역시 맨 처음 봤던 55페이지랑 똑같이 구성되어 있습니다. 여기서 DELETE를 시켜보고 다시 이 페이지를 관찰해보도록 하겠습니다!

DELETE FROM DeleteTest


7_riverluck.png



보시면 4141 이라는 A값은 정상적으로 들어가 있지만.. 노란색 표시?가 사라졌고, PFS에 0%로 변경이 되었습니다.
하지만.. 바이너리 데이터는 변한게 없습니다... 즉 DELETE 역시 데이터를 초기화 하지 않는 다는 것을 알게되었습니다.



그럼 왜?? TRUNCATE보다 DELETE가 빨리 수행이 될지 고민해볼 차례입니다.
둘다 데이터 초기화를 시키는 것도 아닌데.. DELETE가 훨씬 느린건지!!
이유는 바로 Transaction Log에 있습니다.

TRUNCATE TABLE는 페이지의 연결된 사슬만 끊지만..
하지만 DELETE는 ROLLBACK이 한 로우마다.. 트랜잭션 로그에 기록을 해야됩니다.
이래서 결국 DELETE가 느리게 됩니다.

아까 TRUNCATE와 DELETE 시 트랜잭션에 기록하는 내용을 캡처 떠봤습니다.

 
  3_riverluck.png
위의 그림은 TRUNCATE 했을때의 작동하는 것인데요.. 잘 보시면... IAM이 수정되면서 SGAM과 PFS가 수정되는 것을 볼 수 있습니다.

하지만.. DELETE는?

0_riverluck.png

각 로우에 있는 데이터를 지우고.. PFS에 결과를 반환해주는 것을 볼 수 있습니다.

TRUNCATE LOG는 어떻게 보냐?? 이것 또한 Internal Viewer를 깔면 볼 수 있습니다.

11_riverluck.png
이 좋은 인터널 뷰는 어디서 받냐??
 

감사합니다.





profile

안녕하세요. ^^

SQLER Vision팀 1기 이스트럭(강동운) 이라고 합니다.

잘 부탁드립니다. (^^)(__)(^^)


SQLER Vision 1기 cafe: http://cafe.naver.com/sqlervision1

Blog: http://eastluck.tistory.com, http://blog.naver.com/riverluck