[SQL SERVER][Memo]誰說 truncate 操作不會寫到交易記錄檔

[SQL SERVER][Memo]誰說 truncate 操作不會寫到交易記錄檔

之前我寫了5篇交易記錄檔的管理,讓自己對交易記錄檔有了更深層的認識,

以SQL SERVER來說,任何使用者針對資料表操作基本上都會被寫到交易記錄檔(不管你用什麼復原模式),

昨天突然和使用者討論到 truncate table 操作會快速,

主要是因為 truncate table 操作不會寫入交易記錄檔(我常聽很多人這樣講....),

但事實卻不是這樣,truncate 操作還是會寫入交易記錄檔,

但不像 delete 操作採取一行一行刪除資料,而是釋放該資料表所有頁面處理(沒有長時間交易和大量鎖定),

這樣的背景執行處理叫做 deferred-drop,下面我簡單測試一下。

 


alter database mydemo set recovery simple

drop table tbl
create table tbl (c1 int, c2 char (100))
go

-- 1000 rows
declare @i int
select @i = 0
while (@i < 1000) 
begin
insert into tbl select @i, REPLICATE ('rico', 25)
set @i = @i + 1
end

--查看交易記錄檔案內容
image 

這時總共有3269 筆交易操作紀錄。

 

 

執行 Checkpoint後再次查看交易記錄檔案內容

image

簡單復原模式下,checkpoint會截斷交易記錄檔,所以只剩下2筆 CKPT紀錄。

 

 


--執行truncate table
truncate table tbl

image 

image 

可以很明顯看到 truncate 並非使用一筆一筆刪除(因為交易操作紀錄才34筆),

同時truncate操作也是會啟用交易並寫入交易記錄檔的。

 

 

 

參考

Why do TRUNCATE and DROP TABLE complete so fast?