天天看點

第23/24周 臨時資料庫(TempDb)

在今天的性能調優教育訓練裡我們讨論下TempDb——SQL Server的公共廁所,在SQL Server裡我是這樣描述它的。我們的每個人都會經常使用TempDb。有些人直接使用它,有些人不直接使用它。今天我想給你概括介紹下SQL Server裡TempDb的用法,另外我會給你為了更好的性能,如何配置TempDb的一些最佳實踐。

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 CHECKDB或DBCC 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%的自動增長。這個配置會帶來幾個問題:

  • 太多逾時的自動增長操作
  • 日志檔案碎片
  • 闩鎖競争(Latch contention)

我們來詳細看下這些問題。使用預設的8M的初始大小,你的TempDb使用昂貴的自動增長操作會有逾時增長。如果你知道你的TempDb在大小上需要一定的MB,你需要把它設定為初始大小,因為在SQL Server啟動期間,TempDb總從model資料裡重新建立。那個方式你可以避免自動增長操作。如果你依賴于自動增長設定,你也應該使用固定大小,而不是百分比值。這也允許你估計自動增長操作需要花費的時間。使用百分比值,基于目前你的檔案大小會花費越來越長的時間。

你也需要仔細TempDd的事務日志的大小,因為那裡自動增長操作是非常昂貴的。對于任何事務日志, SQL Server不能使用即時檔案初始化(Instant File Initialization)。這意味着在事務日志的自動增長期間,你的資料庫不能通路事務。對于性能關鍵系統,在事務日志上的自動增長操作基本是不可行的。

最後你也會碰到TempDb裡的闩鎖競争問題,因為隻有一個資料檔案可用。當SQL Server在TempDb裡配置設定新對象時,SQL Server需要讀取特定頁(SGAM,GAM,PFS)。這些頁在去寫期間必須被競争。當你運作高度依賴于TempDB的工作時,在TempDb裡這些熱頁上會有競争問題。

這個問題的解決方法是對于TempDb使用多個資料檔案,因為那時SQL Server會通過多個資料檔案使用循環配置設定算法(Round-Robin allocation algorithm),它會減少闩鎖競争問題。如果你使用多個資料檔案,你也需要確定初始大小(一個可能的自動增長值)設定為一樣的值,這樣的話它們會同時增長。

小結

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

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀