臨時數據庫(TempDb)

jopen 9年前發布 | 10K 次閱讀 TempDb SQL Server 數據庫服務器

 

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

TempDb用法

我們的每個人使用TempDb。這是我們要接受的事實。因此按需配置TempDb非常重要——即為了獲得良好的性能。TempDb存儲下列2類對象:

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

    我們來詳細看下這些對象。當我們討論用戶對象時,我們指的是臨時表,表變量和表值函數。在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%的自動增長。這個配置會帶來幾個問題:

    • 太多超時的自動增長操作
    • 日志文件碎片
    • 閂鎖競爭(Latch contention)
    • </ul>

      我們來詳細看下這些問題。使用默認的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的建議。一星期后你會收到 性能調優培訓 的最后一周,我會談下數據庫維護,同時這周祝你玩得開心!

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!