適用於: 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個資料檔,請將每個檔案設為MAXSIZE50 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_kbDMV 中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中分配空間時,可能會開始失敗。 例如,如果您將工作負載群組的固定或百分比限制設定為0default,您可能無法在 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;