[SQL SERVER]大量Insert最小化交易紀錄

[SQL SERVER]大量Insert最小化交易紀錄

SQL Server中任何資料操作基本上都會寫入交易記錄檔中,

如果每筆資料操作都採取完整記錄,無疑會拖慢資料操作效能且交易紀錄檔可能成長快速,

參考文章提到如果要最小化heap交易紀錄,必須達到以下條件

1.資料庫復原模式必須設定為大量新增(bulk-logged)或簡單(simple)。

2.Enable Trace flag 610

3.新增資料必須依照clustered index 排序

但這篇我將測試資料庫完整復原模式下執行大量insert時,

那些方法可以最小化交易紀錄檔。

 

Heap Table

1.insert into select

image

 

查看交易紀錄檔內容

SELECT top 12 Operation,Context,[Log Record Length],[Transaction Name]
FROM fn_dblog(NULL, NULL)
where allocunitname='dbo.testa'

image

交易紀錄檔數量:35488

經過時間:2秒

 

2.insert into with(tablock) select

先執行checkpoint 截斷交易紀錄檔

image

 

查看交易紀錄檔內容

image

交易紀錄檔數量:11291

經過時間:1秒

 

3.select into

先執行checkpoint 截斷交易紀錄檔

image

 

查看交易紀錄檔內容

image

交易紀錄檔數量:74

經過時間: <1秒

 

 

non-Heap Table

create clustered index cidx on testa(c1)

1.insert into select

查看交易紀錄檔內容

SELECT top 12 Operation,Context,[Log Record Length],[Transaction Name]
FROM fn_dblog(NULL, NULL)
where allocunitname='dbo.testa.cidx'

image

交易紀錄檔數量:80844

經過時間: 3秒

 

2.insert into with(tablock) select

查看交易紀錄檔內容

image

交易紀錄檔數量:11229

經過時間: 1秒

 

 

結論:

資料庫完整復原模式下,看來select into 可最小化交易紀錄數量,

其次是透過 tablock 提示也有不錯的效果。

 

 

 

參考

Minimal Logging changes in SQL Server 2008

Minimal Logging changes in SQL Server 2008 (part-2)