Sql Server 中數據庫在BULK_LOGGED/SIMPLE模式下的一些操作會采用最小化日志的記錄方式,以減小tran log落盤日志量從而提高整體性能.
這里我簡單介紹下哪些操作在什么樣的情況下會最小化日志記錄.以及現實生產環境中如何應用最小化日志.
概念:SQL Server在滿足相應條件的基礎上時進行一些特定的操作如Rebuild Index時會進行最小化Tran Log記錄操作,從而改善系統性能.
注意:含最小化操作日志操作段日志無法按時間點恢復(point in time)
需要還原模式為簡單或大容量日志
最小化日志的操作
Create Index,Alter Index Rebulid
Bulk import操作(BCP,Bulk insert)
Select into
Blob數據操作(使用Write等)
Insert select(sql 2008后特定條件下可以)
Merge(特定條件)
應用:實際應用過程中我們實際使用insert select的時候居多,就此介紹
關于insert select操作的最小化日志
聚集表
當聚集表為空時,使用TABLOCK 鎖提示將會最小化日志
當聚集表非空時,無論如何將不會最小化日志
非聚集表
當堆表為空時,使用TABLOCK鎖提示,表中行數據,索引數據(非聚集索引)都會最小化日志
當堆表非空時,使用TABLOCK鎖提示,表中存在非聚集索引,則行數據,索引數據均非最小化日志
注:最小化日志中表非復制表
一些文檔中在堆表有索引非空的情況認為堆行數據會最小化日志,實際是錯誤的.見圖b-2中說明
聚集表實例
聚集空最小化日志 圖a-1
create database testbulkgouse masterALTER DATABASE [testbulk] SET RECOVERY BULK_LOGGED WITH NO_WAITgouse testbulkgocreate table t1(id int not null identity (1,1),dystr varchar(200),fixstr char(500));goset nocount ondeclare @i intset @i=0while(@i<20000)begin insert into t1(dystr,fixstr)values('aaa'+str(RAND()*100000000),'bbb'+str(RAND()*100000000)) set @i=@i+1endcreate table tcls(id int ,dystr varchar(200),fixstr char(500))goCREATE UNIQUE CLUSTERED INDEX inx_id ON dbo.tcls (id)insert into dbo.tcls with(tablockx)select * from dbo.t1 ----cluster table emptyselect Operation,CONTEXT,[Log Record Length],AllocUnitName from fn_dblog(null,null)where AllocUnitName like '%tcls%'
新聞熱點
疑難解答