Tempdb就像Sqlserver的臨時倉庫,各式各樣的對象,數據在里面進行頻繁計算,操作.大量的操作使得tempdb可能面臨很大壓力,tempdb中緩存的設計就是為了緩解這些壓力.這次就為大家介紹下tempdb的緩存機制.
在介紹緩存機制前,先簡單了解一下TempDB對象
一般我們把tempdb對象分為兩種類型用戶對象和內部對象.用戶對象指通過顯式T-sql來創造的對象(如臨時表),內部對象指通過隱式T-sql創建的對象(Worktables)
注:在引入版本控制后,也可以此單獨分類(DMV sys.dm_db_file_space_usage中單獨列出)
用戶對象
臨時表
表變量(包含表值函數返回值及表值參數)
臨時存儲過程
用戶自定義對象
用戶在線(Online)創建索引空間
內部對象
Sorts(排序溢出)
Worktables(checkdb,游標,Merge joins,假脫機,并行查詢交換溢出,LOB對象等)
Workfiles(hash join 溢出)
Version store(版本行控制)
查看對象使用情況
當tempdb數據文件很大或者有異常時,我們可以查看相應的使用情況.如何查看,沄劍的Blog中如何查看某個查詢用了多少TempDB空間有詳細腳本.
Tempdb緩存機制
Tempdb中的眾多對象緩存機制不盡相同,其中一些操作(如Sort)采用內部的機制,對用戶是不可控的,這里我們主要介紹常用對象臨時表/表變量(也是經常引發問題)的緩存機制.
臨時表緩存機制(#t)
只有使用存儲過程,觸發器,Functions才能緩存
以plan cache的形式緩存一個IAM頁和一個DatePage頁
禁止Create后使用DDL操作
禁止命名約束
可以看出臨時表的緩存是以PRoc執行計劃緩存的形式實現的.所以batch,動態sql是無法緩存的.值得注意的是既然是執行計劃緩存,我們就不能在proc中加WITH RECOMPILE關鍵字.
注意:緩存對象時局部臨時表,不包括全局臨時表.
我們通過一個簡單的實例來分析下緩存實現.
首先我們來看下一般batch的操作(非緩存)執行兩次,觀察日志情況如圖1-1
batch create code
use tempdbgocheckpointgocreate table #t(id int)insert into #t select 1drop table #tselect Operation,CONTEXT,[Transaction ID],AllocUnitId,AllocUnitName,[Page ID],[Transaction Name],Description from fn_dblog(null,null)
新聞熱點
疑難解答