最佳化 tempdb 效能

tempdb 資料庫的大小和實體位置會影響系統效能。例如,如果為 tempdb 定義的大小太小,每次您重新啟動 SQL Server 的執行個體時,部分的系統處理負載可能會開始將 tempdb 自動成長到支援工作負載所需的大小。增加 tempdb 資料和記錄檔的大小即可避免這種負載。如需有關決定 tempdb 所需的適當磁碟空間量的資訊,請參閱<tempdb 的容量計畫>。

tempdb 大小和位置的建議

為了達到最佳 tempdb 效能,我們建議實際執行環境中的 tempdb 使用下列組態:

  • 將 tempdb 的復原模型設定為 SIMPLE。此模型會自動收回記錄空間,以保持較小的空間需求。

    如需詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>或<如何:檢視或變更資料庫的復原模式 (SQL Server Management Studio)>。

  • 允許 tempdb 檔案依需要自動成長。這可讓檔案成長到磁碟已滿為止。

    [!附註]

    如果實際執行環境無法容忍自動成長作業期間發生應用程式逾時的可能性,則預先配置空間來容許預期的工作負載。

  • 將檔案成長增量設成合理的大小,可避免 tempdb 資料庫檔案每次成長量的值太小。如果檔案的成長比寫入 tempdb 的資料量少太多,那麼 tempdb 可能必須經常擴大。這樣會影響效能。為 tempdb 檔設定 FILEGROWTH 增量時,建議您根據下列的一般指導方針進行。

    tempdb 檔案大小

    FILEGROWTH 增量

    0 到 100 MB

    10 MB

    100 到 200 MB

    20 MB

    200 MB 以上

    10%*

    * 您可能必須根據 tempdb 檔案所在的 I/O 子系統的速度來調整此百分比。為了避免可能的閂鎖逾時,我們建議將自動成長作業限制為大約兩分鐘。例如,如果 I/O 子系統可以用每秒 50 MB 來初始化檔案,則不管 tempdb 檔案大小如何,FILEGROWTH 增量應該設為最大值 6 GB。可能的話,請使用<立即資料庫檔案初始化>來改進自動成長作業的效能。

  • 您可將檔案大小設定為夠大的值來容納環境中的典型工作負載,藉此為所有 tempdb 檔案預先配置空間。這防止 tempdb 擴充過於頻繁而影響效能。tempdb 資料庫應該設為自動成長,但這應該用來增加非計畫中例外狀況的磁碟空間。

  • 建立最大化磁碟頻寬所需的最多檔案。使用多個檔案可減少 tempdb 儲存體爭用並明顯產生更好的延展性。不過,不要建立太多檔案,因為這樣會降低效能及增加管理負擔。一般來說,請為伺服器上的每一個 CPU 建立一個資料檔 (來負責任何相似性遮罩設定),然後依需要向上或向下調整檔案數。請注意,雙核心 CPU 被視為兩個 CPU。

  • 使每一個資料檔大小相同;這可達到最佳比例填入效能。

  • 將 tempdb 資料庫放在快速的 I/O 子系統上。如果有許多直接連接的磁碟,請使用磁碟條狀配置。

  • 將 tempdb 資料庫放在不同於使用者資料庫所使用的磁碟上。

修改 tempdb 大小和成長參數

您可以使用下列其中一個方法來修改 tempdb 資料檔或記錄檔的大小和檔案成長參數:

每當建立 tempdb 時,即使用檔案大小和檔案成長參數的值。例如,如果您將 tempdb 資料檔的大小增加為 20 MB,並將檔案成長增量增加到 15%,則新值會立即生效。如果後續交易活動造成 tempdb 大小成長,則每次您重新啟動 SQL Server 的執行個體時,資料檔就會回到 20 MB 的大小。

檢視 tempdb 大小和成長參數

您可以使用下列其中一個方法來檢視 tempdb 資料檔或記錄檔的大小和檔案成長參數:

  • SQL Server Management Studio

  • 執行下列查詢。

    SELECT 
        name AS FileName, 
        size*1.0/128 AS FileSizeinMB,
        CASE max_size 
            WHEN 0 THEN 'Autogrowth is off.'
            WHEN -1 THEN 'Autogrowth is on.'
            ELSE 'Log file will grow to a maximum size of 2 TB.'
        END,
        growth AS 'GrowthValue',
        'GrowthIncrement' = 
            CASE
                WHEN growth = 0 THEN 'Size is fixed and will not grow.'
                WHEN growth > 0 AND is_percent_growth = 0 
                    THEN 'Growth value is in 8-KB pages.'
                ELSE 'Growth value is a percentage.'
            END
    FROM tempdb.sys.database_files;
    GO
    

偵測磁碟 I/O 路徑錯誤

當 PAGE_VERIFY 選項設定為 CHECKSUM 時,它就會探索磁碟 I/O 路徑錯誤所造成的損毀資料庫頁面並且在 SQL 錯誤記錄檔中報告這些錯誤,例如 MSSQLSERVER_823MSSQLSERVER_824MSSQLSERVER_825。磁碟 I/O 路徑錯誤可能是資料庫損毀問題的原因,而這通常是因為頁面寫入磁碟時發生的電源故障或磁碟硬體故障所造成的。如需有關 I/O 錯誤的詳細資訊,請參閱<第二章 Microsoft SQL Server I/O 基本概念>(英文)。

在舊版 SQL Server 中,tempdb 資料庫的 PAGE_VERIFY 資料庫選項設定為 NONE 而且無法修改。在 SQL Server 2008 中,新安裝 SQL Server 之 tempdb 資料庫的預設值為 CHECKSUM。升級 SQL Server 安裝時,預設值仍然維持 NONE。我們建議您將 tempdb 資料庫的 PAGE_VERIFY 選項設定為 CHECKSUM。