共用方式為


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_MBGROUP_MAX_TEMPDB_DATA_PERCENT自變數的詳細資訊,請參閱CREATE WORKLOAD GROUPALTER WORKLOAD GROUP

如果同時為相同的工作負載群組指定固定和百分比限制,則固定限制的優先順序高於百分比限制。

在指定的 SQL Server 實例上,您可以混合使用固定限制、百分比限制或沒有空間耗用量限制的 tempdb 工作負載群組。

百分比限制設定

只有在數據文件組態符合下表摘要說明的需求時 tempdb ,百分比限制才會生效:

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

下列查詢可讓您檢視目前的 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,則 MAXSIZEUNLIMITED
  • filegrowth_mbfilegrowth_percent為零時,則FILEGROWTH為零。

如果您設定 GROUP_MAX_TEMPDB_DATA_PERCENT 並執行 ALTER RESOURCE GOVERNOR RECONFIGURE 語句,但數據文件組態不符合需求,語句會順利完成並儲存百分比限制,但不會強制執行這些限制。 在此情況下,您會收到警告訊息 10989,嚴重性 10,GROUP_MAX_TEMPDB_DATA_PERCENT無效,因為不符合 tempdb 設定需求。 訊息也會記錄在錯誤記錄檔中。

若要讓百分比限制生效,請重新設定 tempdb 數據檔以符合需求並再次執行 ALTER RESOURCE GOVERNOR RECONFIGURE 。 如需設定 SIZEFILEGROWTHMAXSIZE的詳細資訊,請參閱 ALTER DATABASE 檔案和檔案群組選項

備註

對於 SQL Server 的新實例,數據檔 MAXSIZEUNLIMITEDFILEGROWTH 大於零,這表示百分比限制無效。 若要使用百分比限制,您必須:

  • tempdb 數據文件預設為其預期大小,並將 FILEGROWTH 設定為零。
  • 將每個數據檔中的MAXSIZE設定為有限的值。
    • 針對每個 tempdb 數據檔磁碟區,請確定磁碟區上檔案的值總和 MAXSIZE 小於或等於磁碟區上的可用磁碟空間。

      例如,如果磁碟區有100 GB的可用空間,而且有兩 tempdb 個資料檔,請將每個檔案設為 MAXSIZE 50 GB或更少。

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

運作方式

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

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

    如果已啟用資源管理員,且 tempdb 已為工作負載群組設定空間耗用量限制,而工作負載群組中執行的要求(查詢)會嘗試讓群組耗用超過限制的總 tempdb 空間耗用量,要求會中止,錯誤 1138 嚴重性 17, 無法為資料庫 'tempdb' 配置新的頁面,因為這會超過工作負載群組 '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_mbgroup_max_tempdb_data_percent列公開。

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

    小提示

    tempdb_data_space_kbpeak_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_groupssys.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) 中開啟物件總管。

  • 除非您已建立自定義工作負載群組和分類函式,將工作負載置於其專設群組中,否則請避免由工作負載群組限制 tempdb 的使用。 當 tempdb 還有任何使用者工作負載無法使用的空間時,可能會中止並返回錯誤 1138 的查詢。

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

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

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