第23/24周 臨時數據庫(TempDb)

在今天的性能調優培訓裏咱們討論下TempDb——SQL Server的公共廁所,在SQL Server裏我是這樣描述它的。咱們的每一個人都會常常使用TempDb。有些人直接使用它,有些人不直接使用它。今天我想給你歸納介紹下SQL Server裏TempDb的用法,另外我會給你爲了更好的性能,如何配置TempDb的一些最佳實踐。html

TempDb用法

咱們的每一個人使用TempDb。這是咱們要接受的事實。所以按需配置TempDb很是重要——即爲了得到良好的性能。TempDb存儲下列3類對象:算法

  • 用戶對象(User Objects
  • 內部對象(Internal Objects
  • 版本存儲(Version Store

咱們來詳細看下這些對象。當咱們討論用戶對象時,咱們指的是臨時表,表變量和表值函數。在SQL Server裏臨時表有2種:本地臨時表,全局臨時表。本地臨時表使用「#」前綴建立,只侷限於建立它的會話。一旦你關閉你的會話,本地臨時表也會在TempDb裏消失。本地臨時表的好處:使用它們,你能夠克服鎖和阻塞問題,由於每一個會話都擁有它本身的,專用的臨時表。數據庫

在SQL Server裏還有全局臨時表,它用「##」前綴建立。這些臨時表在全部會話裏均可以訪問,由於它是全局建立的。最後,SQL Server爲你提供表變量,它在TempDb裏也是物理持久的,但侷限於你定義表變量的批處理裏。表變量是SQL Server裏的內存中結構是個誤解。它們在TempDb里老是持久的。從表值函數返回的表在TempDb裏也是持久的。所以當在SQL Server裏使用這些對象,按需配置它們很是重要。併發

包括做爲開發人員或DBA的你在內——SQL Server自己也總爲內部建立對象存儲使用TempDb。當你使用DBCC CHECKDBDBCC CHECKTABLE運行一致性檢查時,SQL Server在TempDb裏分配工做表,執行計劃裏的排序或者哈希操做也會蔓延到TempDb,這些在TempDb裏也都是物理持久的。當你使用遊標時,甚至Service Broker,你在消耗TempDb裏的空間。若是你用SORT_IN_TEMPDB選項重建索引,你也在使用TempDb。在SQL Server裏TempDb在每一個地方都會用到。函數

另外對於內部對象,SQL Server也支持所謂的版本存儲(Version Store),在SQL Server裏當你使用樂觀併發控制(optimistic concurrency)時或進行在線索引操做時會用到。內部SQL Server分版本存儲爲2個不一樣的存儲:對於觸發器(triggers),快照隔離(Snapshot Isolation),提交讀快照隔離(Read Committed Snapshot Isolation),還有多數據結果集(Multiple Active Result Sets (MARS)),使用通用版本存儲(Common Version Store)。在SQL Server裏在線索引重建版本存儲(Online Index Rebuild Version Store)被在線索引操做使用。性能

TempDB配置

在默認配置裏運行TempDb並真是個好想法。TempDb的默認配置只給你一個數據文件和一個事務日誌文件。在SQL Server 2014裏,數據文件初始大小有8M,對於事務日誌是1M。2個文件都設置爲10%的自動增加。這個配置會帶來幾個問題:ui

  • 太多超時的自動增加操做
  • 日誌文件碎片
  • 閂鎖競爭(Latch contention)

咱們來詳細看下這些問題。使用默認的8M的初始大小,你的TempDb使用昂貴的自動增加操做會有超時增加。若是你知道你的TempDb在大小上須要必定的MB,你須要把它設置爲初始大小,由於在SQL Server啓動期間,TempDb總從model數據裏從新建立。那個方式你能夠避免自動增加操做。若是你依賴於自動增加設置,你也應該使用固定大小,而不是百分比值。這也容許你估計自動增加操做須要花費的時間。使用百分比值,基於當前你的文件大小會花費愈來愈長的時間。spa

你也須要仔細TempDd的事務日誌的大小,由於那裏自動增加操做是很是昂貴的。對於任何事務日誌, SQL Server不能使用即時文件初始化(Instant File Initialization)。這意味着在事務日誌的自動增加期間,你的數據庫不能訪問事務。對於性能關鍵系統,在事務日誌上的自動增加操做基本是不可行的。日誌

最後你也會碰到TempDb裏的閂鎖競爭問題,由於只有一個數據文件可用。當SQL Server在TempDb裏分配新對象時,SQL Server須要讀取特定頁(SGAM,GAMPFS)。這些頁在去寫期間必須被競爭。當你運行高度依賴於TempDB的工做時,在TempDb裏這些熱頁上會有競爭問題。htm

這個問題的解決方法是對於TempDb使用多個數據文件,由於那時SQL Server會經過多個數據文件使用循環分配算法(Round-Robin allocation algorithm),它會減小閂鎖競爭問題。若是你使用多個數據文件,你也須要確保初始大小(一個可能的自動增加值)設置爲同樣的值,這樣的話它們會同時增加。

小結

在今天的性能調優培訓裏咱們討論了SQL Server裏的特定數據庫——TempDb。如你所見,在SQL Server裏每一個人總會使用TempDb——直接或間接。所以按需調整和計劃TempDb很是重要。在第2部分咱們給你一些如何配置TempDb的建議。一星期後你會收到性能調優培訓的最後一週,我會談下數據庫維護,同時祝你這周玩得開心! 

相關文章
相關標籤/搜索