Tempdb 空間資源治理

適用於: SQL Server 2025(17.x)及後續版本

當您啟用 tempdb 空間資源控管時,您可以藉由防止失控的查詢或工作負載耗用大量空間 tempdb來改善可靠性,並避免中斷。

從 SQL Server 2025(17.x)開始,你可以使用資源管理員來限制工作負載群組所佔用的總tempdb空間。 當請求(查詢)嘗試超過限制時,資源調工具會以明顯錯誤中止該限制,表示工作負載群組限制已被強制執行。

實際上,您可以在不同的工作負載之間分割共享 tempdb 空間。 例如,您可以為任務關鍵性應用程式所使用的工作負載群組設定較高的限制,併為所有其他工作負載所使用的工作負載群組設定較低的限制 default 。

如需逐步設定範例,請參閱 教學課程:設定tempdb空間資源治理的範例。

開始使用資源管理員

資源管理員提供彈性架構,為不同的應用程式、使用者、使用者群組等設定不同的 tempdb 空間限制。您也可以根據自訂邏輯來設定限制。

如果你是 SQL Server 中的資源治理新手,請參考資源治理器來了解它的概念與功能。

如需資源管理員設定逐步解說和最佳做法,請參閱 教學課程:資源管理員組態範例和最佳做法。

設定 tempdb 空間耗用量的限制

您可以透過下列兩種方式之一來限制 tempdb 工作負載群組的空間耗用量:

  • 透過參數設定GROUP_MAX_TEMPDB_DATA_MB。

    當您事先知道工作負載的 tempdb 使用需求,或當 tempdb 大小不會變更時,請使用固定限制。

  • 用參數設定GROUP_MAX_TEMPDB_DATA_PERCENT。

    當你可能會隨時間改變最大大小 tempdb ,且希望 tempdb 每個工作負載群組的可用空間能成比例變動而不改變工作組設定時,使用百分比限制。 例如,如果您擴展執行 SQL Server 的 Azure VM 並增加tempdb最大大小,則每個工作負載群組有tempdb百分比限制的可用空間也會相應增加。

如需更多有關 GROUP_MAX_TEMPDB_DATA_MB 和 GROUP_MAX_TEMPDB_DATA_PERCENT 引數的資訊,請參閱 CREATE WORKLOAD GROUP 或 ALTER WORKLOAD GROUP。

如果你同時為同一工作負載群組指定固定上限和百分比上限,固定上限會優先於百分比上限。

在指定的 SQL Server 實例上,您可以混合使用固定限制、百分比限制或沒有空間耗用量限制的 tempdb 工作負載群組。 要查看有效限制,請參閱 「查看每工作負載群組的有效tempdb空間限制 範例」。

百分比限制設定

當您執行 ALTER RESOURCE GOVERNOR RECONFIGURE 陳述式時,百分比限制會依照下表套用:

設定 說明 Tempdb 大小上限 (100%) 百分比限制已生效
- GROUP_MAX_TEMPDB_DATA_MB 未設定
- 對所有資料檔案來說, MAXSIZE 不是 UNLIMITED
- 對於所有資料檔案,FILEGROWTH 皆不為零
tempdb 數據檔可以自動成長到其大小上限 所有數據檔案中MAXSIZE值的總和 是的
- GROUP_MAX_TEMPDB_DATA_MB 未設定
- 針對所有數據檔, MAXSIZE 為 UNLIMITED
- 針對所有數據檔, FILEGROWTH 為零
tempdb 資料檔案已預先成長到預期大小,無法再擴充 所有數據檔案中SIZE值的總和 是的
所有其他組態 否

要查看你的 tempdb 設定,請參考 View tempdb 資料檔案的設定 範例。

使用百分比限制時,請考慮以下幾點:

  • 如果您設定 GROUP_MAX_TEMPDB_DATA_PERCENT 並執行 ALTER RESOURCE GOVERNOR RECONFIGURE 陳述式,但資料檔案組態不符合要求,該陳述式會成功完成,且百分比限制會被儲存,但不會被強制執行。 此時,您會收到警告訊息 10989,嚴重度 10,該訊息也記錄在錯誤日誌中:

    GROUP_MAX_TEMPDB_DATA_PERCENT is not in effect because tempdb
    configuration requirements aren't met.
    
  • 若要讓百分比限制生效,請重新設定 tempdb 數據檔以符合需求並再次執行 ALTER RESOURCE GOVERNOR RECONFIGURE 。 如需有關設定 SIZE、FILEGROWTH 和 MAXSIZE 的詳細資訊,請參閱 ALTER DATABASE檔案與檔案群組選項。

  • 如果百分比限制生效,且您新增、移除或調整tempdb數據檔案的大小,您必須執行ALTER RESOURCE GOVERNOR RECONFIGURE以更新資源管理員,並設置新的最大大小為tempdb(100%)。

備註

對於新的 SQL Server 實例,資料檔案MAXSIZE大小為UNLIMITEDFILEGROWTH且大於零,這表示百分比限制並不有效。 若要使用百分比限制,您必須:

  • 將 tempdb 數據文件預設為其預期大小,並將 FILEGROWTH 設定為零。
  • 將每個數據檔中的MAXSIZE設定為有限的值。
  • 針對每個 tempdb 數據檔磁碟區,請確定磁碟區上檔案的值總和 MAXSIZE 小於或等於磁碟區上的可用磁碟空間。 例如,如果磁碟區有100 GB的可用空間,而且有兩 tempdb 個資料檔,請將每個檔案設為 MAXSIZE 50 GB或更少。

運作方式

本節將 tempdb 詳細說明空間資源治理。

  • 當資料頁在 tempdb 中被配置或解除配置時,資源管理器會記錄每個工作負載群組所消耗的 tempdb 空間。

    若啟用資源調管器且 tempdb 為工作負載群組設定空間使用限制,且該工作負載群組中執行的請求(查詢)嘗試將該群組的總 tempdb 空間消耗量提高至超過限制,則該請求會因錯誤 1138,嚴重度 17 而中止:

    Could not allocate a new page for database 'tempdb' because that
    would exceed the limit set for workload group 'workload-group-name'".
    

    當請求被中止並出現錯誤 1138 時,total_tempdb_data_limit_violation_count 動態管理檢視 (DMV) 的 資料行中的值會增加一,並觸發 tempdb_data_workload_group_limit_reached 擴充事件。

  • 資源調控器會追蹤所有可歸因於工作負載群組的 tempdb 使用量,包括臨時表、變數(包括表格變數)、表格值參數、永久表、資料指標,以及查詢處理期間的 tempdb 使用量,例如中繼、溢出、工作表和工作檔。

    在tempdb中,全域臨時表和非臨時表的空間使用都會歸入插入第一資料列的工作負載群組,即使來自其他工作負載群組的會話新增、修改或移除相同資料表中的資料列也一樣。

  • 每個工作負載群組的已設定tempdb耗用量限制會在 sys.resource_governor_workload_groups 目錄檢視中的group_max_tempdb_data_mb和group_max_tempdb_data_percent列公開。

    工作負載群組目前的空間耗用量和尖峰耗用量會分別在 tempdb 和 欄位的 tempdb_data_space_kb DMV 中peak_tempdb_data_space_kb公開。

    小提示

    tempdb_data_space_kb 和 peak_tempdb_data_space_kb 欄位在 sys.dm_resource_governor_workload_groups 中即使未設定 tempdb 空間耗用量限制,仍會被維護。

    您可以建立分類器函式和工作負載群組,而不需要一開始設定任何限制。 監視 tempdb 每個群組一段時間的使用量,以建立代表性的使用模式,然後視需要設定限制。

  • tempdb版本存放區的使用量,包括在啟用tempdb的持續性版本存放區(PVS),並不受約束,因為數據列版本可能被多個工作負載群組中的要求使用。

  • 中的 tempdb 空間耗用量會算作所使用的 8 KB 數據頁數目。 即使頁面未完整填入數據,它仍會將 8 KB 新增至 tempdb 工作負載群組的耗用量。

  • tempdb 空間會計在工作負載群組的整個生命周期內保持維持。 如果在 tempdb 中刪除工作負載群組,而仍有數據屬於該工作負載群組的全域臨時表或永久表,則這些表所使用的空間不會被記入其他工作負載群組。

  • tempdb 空間資源控管會控制數據檔中的 tempdb 空間,但不會控制基礎磁碟區上的磁碟空間。 除非你預先將資料檔案擴充 tempdb 到預期大小,否則 所在磁碟區 tempdb 的空間可能會被其他檔案佔用。 如果數據檔沒有剩餘空間 tempdb 可成長,則在 tempdb 達到空間耗用量的任何工作負載群組限制 tempdb 之前,可能會用盡空間。

  • 中的 tempdb 空間資源控管適用於數據檔,但不適用於事務歷史記錄檔。 若要確保 中的tempdb事務歷史記錄不會耗用大量的空間,請在 中啟用 tempdb。

會話層級空間追蹤的差異

sys.dm_db_session_space_usage DMV 會為每個會話提供tempdb空間配置和解除分配統計數據。 即使工作負載群組中只有一個工作階段,這個 DMV 的空間使用統計資料也可能與 sys.dm_resource_governor_workload_groups 檢視中的統計資料不完全相符,原因如下:

  • 不同於 sys.dm_resource_governor_workload_groups, sys.dm_db_session_space_usage
    • 不會反映 tempdb 當前正在運行任務的空間使用情況。 中的 sys.dm_db_session_space_usage 統計數據會在工作完成時更新。 中的 sys.dm_resource_governor_workload_groups 統計數據會持續更新。
    • 不會追蹤索引分配對應(IAM)頁面。 欲了解更多資訊,請參閱 頁面與範圍架構指南。
  • 當資料列被刪除,或資料表、索引或分割區被捨棄或截斷時,資料庫引擎會重新分配資料頁。 釋放可以是同步的,也可以是由非同步背景程序執行。 sys.dm_resource_governor_workload_groups 會在發生時反映這些頁面解除分配,即使導致這些解除分配的會話已關閉,而且不再存在於 中 sys.dm_db_session_space_usage。

tempdb 空間資源治理的最佳做法

設定 tempdb 空間資源治理之前,請考慮下列最佳做法:

  • 檢閱資源管理員的一般 最佳做法 。

  • 在大部分情況下,請避免將 tempdb 空間耗用量限制設定為小型值或零,特別是針對 default 工作負載群組。 如果你將此限制設為較小的值或零,許多常見工作在需要於 tempdb 中分配空間時,可能會開始失敗。 例如,如果您將工作負載群組的固定或百分比限制設定為0 default ,您可能無法在 SQL Server Management Studio (SSMS) 中開啟物件總管。

  • 除非您建立自訂工作負載群組和分類器函式,將工作負載放入其專屬群組,否則請避免限制 tempdbdefault 工作負載群組的使用。 如果您透過 tempdb 工作負載群組限制 default 的空間耗用,查詢可能會傳回錯誤 1138。 當 tempdb 仍有任何使用者工作負載都無法使用的未使用空間時,就會發生此錯誤。

  • 所有工作負載群組的 GROUP_MAX_TEMPDB_DATA_MB 數值總和可能超過最大 tempdb 大小。 例如,如果大小上限 tempdb 為 100 GB, GROUP_MAX_TEMPDB_DATA_MB 工作負載群組 A 和工作負載群組 B 的限制可以是 80 GB。

    此方法仍能防止每個工作負載群組耗用 tempdb 中的所有空間,因為會保留 20 GB 給其他工作負載群組使用。 同時,當可用 tempdb 空間仍然可用時,您可以避免不必要的查詢中止,因為工作負載群組 A 和 B 不太可能同時耗用大量的 tempdb 空間。

    同樣地,所有工作負載群組的值總和 GROUP_MAX_TEMPDB_DATA_PERCENT 可能超過100%。 如果您知道多個群組不太可能同時造成高tempdb使用量,您可以將更多tempdb空間配置給每個群組。

Examples

檢視 tempdb 資料檔案設定

以下查詢顯示目前的資料 tempdb 檔案設定:

SELECT file_id,
       name,
       size * 8. / 1024 AS size_mb,
       IIF (max_size = -1, NULL, max_size * 8. / 1024) AS maxsize_mb,
       IIF (is_percent_growth = 0, growth * 8. / 1024, NULL) AS filegrowth_mb,
       IIF (is_percent_growth = 1, growth, NULL) AS filegrowth_percent
FROM sys.master_files
WHERE database_id = 2
      AND type_desc = 'ROWS';

針對結果集中的特定檔案:

  • 如果 maxsize_mb 欄是 NULL,則 MAXSIZE 為 UNLIMITED。
  • 當filegrowth_mb或filegrowth_percent為零時,則FILEGROWTH為零。

查看每個工作負載群組的有效 tempdb 空間限制

以下查詢顯示每個工作負載群組的有效 tempdb 空間消耗上限。 對於 固定限制 或 百分比限制 配置,限制以兆位元組為單位回傳。

若欄位 group_effective_limit_mb 為 NULL,則表示以下其中之一:

  • 既沒有設定固定也沒有百分比限制。
  • 使用百分比限制配置的 條件 未被滿足。
SELECT wg.group_id,
       wg.name,
       tf.tempdb_max_size_mb,
       CASE
           WHEN wg.group_max_tempdb_data_mb IS NOT NULL
               THEN wg.group_max_tempdb_data_mb
           WHEN wg.group_max_tempdb_data_percent IS NOT NULL AND tf.tempdb_max_size_mb IS NOT NULL
               THEN 0.01 * wg.group_max_tempdb_data_percent * tf.tempdb_max_size_mb
       ELSE NULL END AS group_effective_limit_mb
FROM sys.resource_governor_workload_groups AS wg
CROSS APPLY (
    SELECT IIF (SUM(IIF (max_size <> -1
        AND growth > 0, 1, 0)) = COUNT(1) /* autogrow up to the maxsize */
        OR SUM(IIF (max_size = -1
        AND growth = 0, 1, 0)) = COUNT(1), /* pregrown and fixed */
        SUM(IIF (growth = 0, size, max_size)) * 8 / 1024., NULL) AS tempdb_max_size_mb
    FROM sys.master_files
    WHERE database_id = 2
        AND type_desc = 'ROWS'
) AS tf;

後續步驟