[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
--查看交易記錄檔案內容
這時總共有3269 筆交易操作紀錄。
執行 Checkpoint後再次查看交易記錄檔案內容
簡單復原模式下,checkpoint會截斷交易記錄檔,所以只剩下2筆 CKPT紀錄。
--執行truncate table
truncate table tbl
可以很明顯看到 truncate 並非使用一筆一筆刪除(因為交易操作紀錄才34筆),
同時truncate操作也是會啟用交易並寫入交易記錄檔的。
參考