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 大小,那么对于每个具有百分比限制的工作负载组,可用空间也会相应增加。

关于GROUP_MAX_TEMPDB_DATA_MBGROUP_MAX_TEMPDB_DATA_PERCENT参数的详细信息,请参阅 CREATE WORKLOAD GROUPALTER WORKLOAD GROUP

如果为同一工作负荷组指定了固定限制和百分比限制,则固定限制优先于百分比限制。

在给定的 SQL Server 实例上,你可以混合使用 tempdb 空间消耗具有固定限制、百分比限制或不受限制的工作负荷组。

百分比限制配置

仅当数据文件配置满足下表中汇总的要求时 tempdb ,百分比限制才会生效:

配置 DESCRIPTION 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_mbNULL,则 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 的新实例,数据文件MAXSIZEUNLIMITED大于FILEGROWTH零,这意味着百分比限制无效。 若要使用百分比限制,必须:

  • 首先将数据文件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 时,sys.dm_resource_governor_workload_groups动态管理视图(DMV)列中的值total_tempdb_data_limit_violation_count将递增一个,并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 空间的当前消耗量和峰值消耗量分别在 sys.dm_resource_governor_workload_groups DMV 以及 tempdb_data_space_kbpeak_tempdb_data_space_kb 列中公开。

    小窍门

    即使未设置 tempdb 空间消耗限制,也会保留 sys.dm_resource_governor_workload_groups 中的 tempdb_data_space_kbpeak_tempdb_data_space_kb 列。

    可以创建分类器函数和工作负荷组,而无需最初设置任何限制。 监视 tempdb 每个组随时间推移的使用情况,以建立具有代表性的使用模式,然后根据需要设置限制。

  • Tempdb 版本存储的使用(包括在启用了加速数据库恢复(ADR) 时的持久版本存储(PVS))不受限制,因为多个工作负荷组中的请求可能会使用行版本。

  • tempdb 中的空间消耗按使用的 8 KB 数据页数计算。 即使页面中的数据未完全填满,它也会使工作负载组的 tempdb 消耗增加 8 KB。

  • Tempdb 空间会计在工作负荷组的生存期内保持。 如果在全局临时表或与该工作负荷组关联的数据的非临时表仍存在于tempdb时删除了工作负荷组,那么这些表所使用的空间不会被计入其他任何工作负荷组。

  • Tempdb 空间资源治理控制 tempdb 数据文件中的空间,但不控制基础卷上的磁盘空间。 除非将数据文件 tempdb 预先增长到其预期的大小,否则 tempdb 所在的卷上的空间可能会被其他文件占用。 如果 tempdb 没有剩余空间供数据文件增长,则在 tempdb 达到任何工作负荷组的空间消耗限制之前,tempdb 可能会耗尽空间。

  • 空间资源治理 tempdb 适用于数据文件,但不适用于事务日志文件。 为了确保tempdb中的事务日志不会占用大量空间,请在tempdb中启用ADR

会话级别空间跟踪的不同之处

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)中打开对象资源管理器。

  • 除非你创建了自定义工作负荷组和一个分类器函数,将工作负荷置于其专用组中,否则请避免将 tempdb 的使用限制在 default 工作负荷组中。 当 tempdb 仍有未被任何用户工作负载使用的空闲空间时,查询可能会因错误 1138 而中止。

  • 允许所有工作负荷组的值总和 GROUP_MAX_TEMPDB_DATA_MB 超过最大 tempdb 大小。 例如,如果最大大小为 100 GB,那么工作负荷组 tempdb 和工作负荷组 GROUP_MAX_TEMPDB_DATA_MB 的限制可以是 80 GB 每组。

    此方法仍会通过为其他工作负荷组保留 20 GB 空间,阻止每个工作负荷组占用 tempdb 中的所有空间。 同时,当可用 tempdb 空间仍然可用时,可以避免不必要的查询中止,因为工作负荷组 AB 不太可能同时占用大量 tempdb 空间。

    同样,所有工作负荷组的值总和 GROUP_MAX_TEMPDB_DATA_PERCENT 可以超过 100%。 如果知道多个组不太可能同时导致高tempdb使用率,则可以为每个组分配更多tempdb空间。