CREATE WORKLOAD GROUP (Transact-SQL)

选择一个产品

在下面的行中,选择你感兴趣的产品名称,系统将只显示该产品的信息。

* SQL Server *  

 

SQL Server 和 SQL 托管实例

创建资源调控器工作负荷组,并将工作负荷组与资源调控器资源池相关联。

资源调控器在 SQL Server 的每个版本中都不可用。 有关 SQL Server 各个版次支持的功能列表,请参阅 SQL Server 2022 的各个版次及其支持的功能

注意

对于 Azure SQL 托管实例,必须在 master 数据库的上下文中修改资源调控器配置。

Transact-SQL 语法约定

语法

CREATE WORKLOAD GROUP group_name
[ WITH
    ( [ IMPORTANCE = { LOW | MEDIUM | HIGH } ]
      [ [ , ] REQUEST_MAX_MEMORY_GRANT_PERCENT = value ]
      [ [ , ] REQUEST_MAX_CPU_TIME_SEC = value ]
      [ [ , ] REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value ]
      [ [ , ] MAX_DOP = value ]
      [ [ , ] GROUP_MAX_REQUESTS = value ] )
]
[ USING {
    [ pool_name | [default] ]
    [ [ , ] EXTERNAL external_pool_name | [default] ]
    } ]
[ ; ]

参数

group_name

工作负荷组的用户定义名称。 group_name 为字母数字,最多可以包含 128 个字符,在数据库引擎实例中必须唯一,并且必须符合 数据库标识符的规则。

IMPORTANCE = { LOW | MEDIUM | HIGH }

指定工作负荷组中某个请求的相对重要性。 默认值为 MEDIUM

IMPORTANCE 是包含工作负荷组的资源池的本地。 同一资源池内具有不同重要性的工作负荷组相互影响,但不会影响其他资源池中的工作负荷组。

REQUEST_MAX_MEMORY_GRANT_PERCENT = value

指定单个请求可从池获取的最大查询工作区内存量。 MAX_MEMORY_PERCENT定义的资源池大小的百分比。 默认值为 25。

在 SQL Server 2017(14.x)及更早版本中, 为整数,允许的范围从 1 到 100。

从 SQL Server 2019 (15.x)开始,该值可以使用 float 数据类型的小数部分。 允许的范围从 0 到 100。

重要

指定的金额仅指通过查询内存授予获得的查询工作区内存。

不建议设置 过大(例如大于 70),因为服务器可能无法为其他并发查询留出足够的可用内存。 这可能会导致内存授予超时 错误 8645

设置为 0 或小值可能会阻止使用需要工作区内存(如 sorthash)的运算符的查询在用户定义的工作负荷组中运行。 如果查询内存要求超出此参数定义的限制,则会发生以下行为:

  • 对于用户定义的工作负荷组,服务器会尝试减少请求(DOP)的并行度(查询),直到内存要求低于限制,或直到 DOP 等于 1。 如果查询内存要求仍大于限制,则会发生错误 8657,并且查询失败。
  • 对于 internaldefault 工作负荷组,服务器允许查询获取所需的内存。

在任一情况下,如果服务器的物理内存不足,则可能会出现 错误 8645

REQUEST_MAX_CPU_TIME_SEC = value

指定请求可以使用的最长 CPU 时间,以秒为单位。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,也就是说无限制 。

默认情况下,如果超过最大时间,资源调控器不会阻止请求继续。 但是,将生成事件。 有关详细信息,请参阅 CPU Threshold Exceeded 事件类

从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始,并使用 跟踪标志 2422,资源调控器在超过最大 CPU 时间时中止请求。

REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value

指定查询可以等待查询工作区内存中的内存授予可用的最大时间(以秒为单位)。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,表示使用基于查询开销的内部计算来确定最长时间 。

达到内存授予超时时,查询并不总是失败。 仅当运行过多并发查询时,查询才会失败。 否则,查询可能只获得最小内存授予,从而导致查询性能降低。

MAX_DOP = value

指定并行查询执行的最大并行度(MAXDOP)。 value 的允许范围为 0 到 64 。 value 的默认设置为 0,表示使用全局设置 。

有关详细信息,请参阅 MAXDOP

GROUP_MAX_REQUESTS = value

指定在工作负荷组中允许执行的同时请求最大数。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,表示允许的请求数不限 。 达到最大并发请求时,可以创建该组中的会话,但会处于等待状态,直到并发请求数低于指定的值。

USING { pool_name |[default] }

将工作负荷组与由 pool_name标识的用户定义资源池或 default 资源池相关联。 如果未提供 pool_name,或者未指定 USING 参数,则工作负荷组与内置 default 池相关联。

default 是保留字,在 USING中指定时,必须用括号([])或引号("")括起来。

内置资源池和工作负荷组使用所有小写名称,例如 default。 在使用区分大小写的排序规则的服务器上使用小写 default。 不区分大小写的排序规则的服务器将 defaultDefaultDEFAULT 视为相同的值。

EXTERNAL external_pool_name |[default]

适用于:SQL Server 2016 (13.x) 及更高版本。

工作负荷组可以指定一个外部资源池。 可以定义一个工作负荷组并将其与两个池相关联:

  • 数据库引擎工作负荷的资源池。
  • 外部进程的外部资源池。 有关详细信息,请参阅 sp_execute_external_script

备注

有关详细信息,请参阅 资源调控器资源调控器工作负荷组

MAXDOP

对于给定的查询,将按如下所示确定有效的 MAXDOP

  • 只要查询提示不超过工作负荷组 MAX_DOP 设置,就 MAXDOP 作为查询提示。
  • MAXDOP 作为查询提示始终替代 max degree of parallelism 服务器配置。 有关详细信息,请参阅 服务器配置:最大并行度
  • 工作负荷组 MAX_DOP 替代 max degree of parallelism 服务器配置和 MAXDOP数据库范围的配置

将按MAXDOP设置 限制。 它不是按请求限制或按查询限制。 在执行并行查询期间,单个请求可以生成分配给 计划程序的多个任务。 有关详细信息,请参阅 线程和任务体系结构指南

当查询在编译时(MAXDOP = 1)标记为串行时,无论工作负荷组或服务器配置设置如何,它都不能在运行时以并行方式执行。 为查询确定 MAXDOP 后,由于内存压力,只能降低该查询。 工作负荷组重新配置不会影响在内存授予队列中等待的查询。

索引创建

出于性能原因,允许索引创建使用比最初授予的更多内存工作区。 资源调控器支持这种特殊处理。 但是,初始授予和任何其他内存授予受工作负荷组和资源池设置的限制。

在分区表上创建非对齐索引所消耗的内存与所涉及的分区数成正比。 如果所需内存总量超过 REQUEST_MAX_MEMORY_GRANT_PERCENT 工作负荷组设置强制实施的每个查询限制,则创建索引可能会失败。 由于 default 工作负荷组允许查询超出每个查询的限制,且所需的最小内存才能开始向后兼容,因此,如果 default 资源池有足够的总内存,则可以使用 default 工作负荷组创建相同的索引。

权限

需要 CONTROL SERVER 权限。

示例

default 资源池中创建名为 newReports 的工作负荷组,并限制最大内存授予、请求的最大 CPU 时间以及 MAXDOP

CREATE WORKLOAD GROUP newReports
WITH (
     REQUEST_MAX_MEMORY_GRANT_PERCENT = 2.5,
     REQUEST_MAX_CPU_TIME_SEC = 100,
     MAX_DOP = 4
     )
USING [default];

* SQL 托管实例 *  

 

SQL Server 和 SQL 托管实例

创建资源调控器工作负荷组,并将工作负荷组与资源调控器资源池相关联。

资源调控器在 SQL Server 的每个版本中都不可用。 有关 SQL Server 各个版次支持的功能列表,请参阅 SQL Server 2022 的各个版次及其支持的功能

注意

对于 Azure SQL 托管实例,必须在 master 数据库的上下文中修改资源调控器配置。

Transact-SQL 语法约定

语法

CREATE WORKLOAD GROUP group_name
[ WITH
    ( [ IMPORTANCE = { LOW | MEDIUM | HIGH } ]
      [ [ , ] REQUEST_MAX_MEMORY_GRANT_PERCENT = value ]
      [ [ , ] REQUEST_MAX_CPU_TIME_SEC = value ]
      [ [ , ] REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value ]
      [ [ , ] MAX_DOP = value ]
      [ [ , ] GROUP_MAX_REQUESTS = value ] )
]
[ USING {
    [ pool_name | [default] ]
    [ [ , ] EXTERNAL external_pool_name | [default] ]
    } ]
[ ; ]

参数

group_name

工作负荷组的用户定义名称。 group_name 为字母数字,最多可以包含 128 个字符,在数据库引擎实例中必须唯一,并且必须符合 数据库标识符的规则。

IMPORTANCE = { LOW | MEDIUM | HIGH }

指定工作负荷组中某个请求的相对重要性。 默认值为 MEDIUM

IMPORTANCE 是包含工作负荷组的资源池的本地。 同一资源池内具有不同重要性的工作负荷组相互影响,但不会影响其他资源池中的工作负荷组。

REQUEST_MAX_MEMORY_GRANT_PERCENT = value

指定单个请求可从池获取的最大查询工作区内存量。 MAX_MEMORY_PERCENT定义的资源池大小的百分比。 默认值为 25。

在 SQL Server 2017(14.x)及更早版本中, 为整数,允许的范围从 1 到 100。

从 SQL Server 2019 (15.x)开始,该值可以使用 float 数据类型的小数部分。 允许的范围从 0 到 100。

重要

指定的金额仅指通过查询内存授予获得的查询工作区内存。

不建议设置 过大(例如大于 70),因为服务器可能无法为其他并发查询留出足够的可用内存。 这可能会导致内存授予超时 错误 8645

设置为 0 或小值可能会阻止使用需要工作区内存(如 sorthash)的运算符的查询在用户定义的工作负荷组中运行。 如果查询内存要求超出此参数定义的限制,则会发生以下行为:

  • 对于用户定义的工作负荷组,服务器会尝试减少请求(DOP)的并行度(查询),直到内存要求低于限制,或直到 DOP 等于 1。 如果查询内存要求仍大于限制,则会发生错误 8657,并且查询失败。
  • 对于 internaldefault 工作负荷组,服务器允许查询获取所需的内存。

在任一情况下,如果服务器的物理内存不足,则可能会出现 错误 8645

REQUEST_MAX_CPU_TIME_SEC = value

指定请求可以使用的最长 CPU 时间,以秒为单位。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,也就是说无限制 。

默认情况下,如果超过最大时间,资源调控器不会阻止请求继续。 但是,将生成事件。 有关详细信息,请参阅 CPU Threshold Exceeded 事件类

从 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 开始,并使用 跟踪标志 2422,资源调控器在超过最大 CPU 时间时中止请求。

REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value

指定查询可以等待查询工作区内存中的内存授予可用的最大时间(以秒为单位)。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,表示使用基于查询开销的内部计算来确定最长时间 。

达到内存授予超时时,查询并不总是失败。 仅当运行过多并发查询时,查询才会失败。 否则,查询可能只获得最小内存授予,从而导致查询性能降低。

MAX_DOP = value

指定并行查询执行的最大并行度(MAXDOP)。 value 的允许范围为 0 到 64 。 value 的默认设置为 0,表示使用全局设置 。

有关详细信息,请参阅 MAXDOP

GROUP_MAX_REQUESTS = value

指定在工作负荷组中允许执行的同时请求最大数。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,表示允许的请求数不限 。 达到最大并发请求时,可以创建该组中的会话,但会处于等待状态,直到并发请求数低于指定的值。

USING { pool_name |[default] }

将工作负荷组与由 pool_name标识的用户定义资源池或 default 资源池相关联。 如果未提供 pool_name,或者未指定 USING 参数,则工作负荷组与内置 default 池相关联。

default 是保留字,在 USING中指定时,必须用括号([])或引号("")括起来。

内置资源池和工作负荷组使用所有小写名称,例如 default。 在使用区分大小写的排序规则的服务器上使用小写 default。 不区分大小写的排序规则的服务器将 defaultDefaultDEFAULT 视为相同的值。

EXTERNAL external_pool_name |[default]

适用于:SQL Server 2016 (13.x) 及更高版本。

工作负荷组可以指定一个外部资源池。 可以定义一个工作负荷组并将其与两个池相关联:

  • 数据库引擎工作负荷的资源池。
  • 外部进程的外部资源池。 有关详细信息,请参阅 sp_execute_external_script

备注

有关详细信息,请参阅 资源调控器资源调控器工作负荷组

MAXDOP

对于给定的查询,将按如下所示确定有效的 MAXDOP

  • 只要查询提示不超过工作负荷组 MAX_DOP 设置,就 MAXDOP 作为查询提示。
  • MAXDOP 作为查询提示始终替代 max degree of parallelism 服务器配置。 有关详细信息,请参阅 服务器配置:最大并行度
  • 工作负荷组 MAX_DOP 替代 max degree of parallelism 服务器配置和 MAXDOP数据库范围的配置

将按MAXDOP设置 限制。 它不是按请求限制或按查询限制。 在执行并行查询期间,单个请求可以生成分配给 计划程序的多个任务。 有关详细信息,请参阅 线程和任务体系结构指南

当查询在编译时(MAXDOP = 1)标记为串行时,无论工作负荷组或服务器配置设置如何,它都不能在运行时以并行方式执行。 为查询确定 MAXDOP 后,由于内存压力,只能降低该查询。 工作负荷组重新配置不会影响在内存授予队列中等待的查询。

索引创建

出于性能原因,允许索引创建使用比最初授予的更多内存工作区。 资源调控器支持这种特殊处理。 但是,初始授予和任何其他内存授予受工作负荷组和资源池设置的限制。

在分区表上创建非对齐索引所消耗的内存与所涉及的分区数成正比。 如果所需内存总量超过 REQUEST_MAX_MEMORY_GRANT_PERCENT 工作负荷组设置强制实施的每个查询限制,则创建索引可能会失败。 由于 default 工作负荷组允许查询超出每个查询的限制,且所需的最小内存才能开始向后兼容,因此,如果 default 资源池有足够的总内存,则可以使用 default 工作负荷组创建相同的索引。

权限

需要 CONTROL SERVER 权限。

示例

default 资源池中创建名为 newReports 的工作负荷组,并限制最大内存授予、请求的最大 CPU 时间以及 MAXDOP

CREATE WORKLOAD GROUP newReports
WITH (
     REQUEST_MAX_MEMORY_GRANT_PERCENT = 2.5,
     REQUEST_MAX_CPU_TIME_SEC = 100,
     MAX_DOP = 4
     )
USING [default];

* Azure Synapse
Analytics *  

 

Azure Synapse Analytics

创建工作负荷组。 工作负荷组是一组请求的容器,是在系统上配置工作负荷管理的基础。 通过使用工作负荷组,能够为工作负荷隔离保留资源、包含资源、定义每个请求的资源并遵循执行规则。 语句完成后,设置生效。

Transact-SQL 语法约定

CREATE WORKLOAD GROUP group_name
 WITH
 (   MIN_PERCENTAGE_RESOURCE = value 
   , CAP_PERCENTAGE_RESOURCE = value 
   , REQUEST_MIN_RESOURCE_GRANT_PERCENT = value
  [ [ , ] REQUEST_MAX_RESOURCE_GRANT_PERCENT = value ]
  [ [ , ] IMPORTANCE = { LOW | BELOW_NORMAL | NORMAL | ABOVE_NORMAL | HIGH } ]
  [ [ , ] QUERY_EXECUTION_TIMEOUT_SEC = value ] )
  [ ; ]

group_name 指定用于标识工作负荷组的名称。 group_name 为 sysname。 最长可为 128 个字符,并且在实例中必须是唯一的。

MIN_PERCENTAGE_RESOURCE = value 指定为此工作负荷组保证的最小资源分配,这些资源不与其他工作负荷组共享。 内存是唯一受此参数控制的资源。 value 为 0 到 100 之间的整数。 所有工作负荷组的 min_percentage_resource 的总和不能超过 100。 min_percentage_resource 的值不能大于 cap_percentage_resource。 有每个服务级别允许的最小有效值。 有关更多详细信息,请参阅有效值

CAP_PERCENTAGE_RESOURCE = value 指定工作负荷组中所有请求的最大资源利用率。 CPU 和内存资源都受此参数限制。 整数取值范围为 1 到 100。 cap_percentage_resource 的值必须大于 min_percentage_resource。 如果在其他工作负荷组中将 min_percentage_resource 配置为大于零,则 cap_percentage_resource 的有效值会减少。

REQUEST_MIN_RESOURCE_GRANT_PERCENT = value 设置每个请求分配到的最小资源量。 内存是唯一受此参数控制的资源。 value 是一个必需参数,取值范围为 0.75 到 100.00(十进制)。 request_min_resource_grant_percent 的值必须是0.25 的倍数,必须是 min_percentage_resource 的因数,且小于 cap_percentage_resource。 有每个服务级别允许的最小有效值。 有关更多详细信息,请参阅有效值

例如:

CREATE WORKLOAD GROUP wgSample 
WITH
  ( MIN_PERCENTAGE_RESOURCE = 26                -- integer value
    , REQUEST_MIN_RESOURCE_GRANT_PERCENT = 3.25 -- factor of 26 (guaranteed a minimum of 8 concurrency)
    , CAP_PERCENTAGE_RESOURCE = 100 )

将用于资源类的值视为 request_min_resource_grant_percent 的基准。 下表包含用于 Gen2 的资源分配。

资源类 资源的百分比
Smallrc 3%
Mediumrc 10%
Largerc 22%
Xlargerc 70%

REQUEST_MAX_RESOURCE_GRANT_PERCENT = value
设置每个请求分配的最小资源量。 内存是唯一受此参数控制的资源。 value 是一个可选十进制参数,其默认值等于 request_min_resource_grant_percent。 value 必须大于或等于 request_min_resource_grant_percent。 当 request_max_resource_grant_percent 的值大于 request_min_resource_grant_percent 并且系统资源可用时,会向请求分配其他资源。

IMPORTANCE = { LOW | BELOW_NORMAL | NORMAL | ABOVE_NORMAL | HIGH }
指定工作负荷组中某个请求的默认重要性。 重要性为下列值之一,默认值为 NORMAL:

  • LOW
  • BELOW_NORMAL
  • NORMAL(默认值)
  • ABOVE_NORMAL
  • HIGH

在工作负荷组设置的重要性是工作负荷组中所有请求的默认重要性。 用户还可以在分类器级别设置重要性,这可能会覆盖工作负荷组的重要性设置。 这允许对工作负荷组内请求的重要性进行区分,以便更快地访问非保留资源。 当工作负荷组 min_percentage_resource 的总和小于 100 时,将根据重要性分配非保留资源。

QUERY_EXECUTION_TIMEOUT_SEC = value
指定查询在取消之前可以执行的最长时间(以秒为单位)。 value 必须为 0 或一个正整数 。 value 的默认设置为 0,查询永不超时。QUERY_EXECUTION_TIMEOUT_SEC 在查询处于运行状态时而不是在查询加入队列时进行计数。

备注

自动创建对应于资源类的工作负荷组,以实现后向兼容性。 不能删除这些系统定义的工作负荷组。 可以创建额外的 8 个用户定义的工作负荷组。

如果使用大于零的 min_percentage_resource 创建工作负载组,则 CREATE WORKLOAD GROUP 语句将加入队列,直到有足够的资源来创建工作负载组。

有效值

参数 min_percentage_resourcecap_percentage_resourcerequest_min_resource_grant_percentrequest_max_resource_grant_percent 具有在当前服务级别和其他工作负载组配置的上下文基础上进行了调整的有效值。

request_min_resource_grant_percent 参数具有有效值,因为每个查询所需的最小资源数取决于服务级别。 例如,在最低的 DW100c 服务级别,每个请求至少需要 25% 的资源。 如果将工作负荷组配置为具有 3% 的 request_min_resource_grant_percentrequest_max_resource_grant_percent,则在启动实例时,两个参数的有效值将调整为 25%。 如果将实例扩展到 DW1000c,则两个参数的已配置值和有效值均为 3%,因为 3% 是该服务级别支持的最小值。 如果将实例扩展到 DW1000c 以上,则这两个参数的已配置值和有效值将保持在 3%。 有关不同服务级别的有效值的更多详细信息,请参阅下表。

服务级别 REQUEST_MIN_RESOURCE_GRANT_PERCENT 的最低有效值 最大并行查询
DW100c 25% 4
DW200c 12.5% 8
DW300c 8% 12
DW400c 6.25% 16
DW500c 5% 20
DW1000c 3% 32
DW1500c 3% 32
DW2000c 2% 48
DW2500c 2% 48
DW3000c 1.5% 64
DW5000c 1.5% 64
DW6000c 0.75% 128
DW7500c 0.75% 128
DW10000c 0.75% 128
DW15000c 0.75% 128
DW30000c 0.75% 128

min_percentage_resource 参数必须大于或等于有效 request_min_resource_grant_percent。 如果工作负荷组的 min_percentage_resource 被配置为小于有效 min_percentage_resource,那么在运行时,该值会被调整为零。 发生这种情况时,为 min_percentage_resource 配置的资源可在所有工作负荷组中共享。 例如,工作负荷组 wgAdHocmin_percentage_resource 为 10%,在 DW1000c 服务级别运行,其有效 min_percentage_resource 将为 10%(DW1000c 支持的最低值为 3%)。 DW100c 级别的 wgAdhoc 的有效 min_percentage_resource 为 0%。 为 wgAdhoc 配置的 10% 将在所有工作负载组之间共享。

cap_percentage_resource 参数也具有有效值。 如果工作负载组 wgAdhoccap_percentage_resource 配置为 100%,并且创建了另一个工作负载组 wgDashboards,其 min_percentage_resource 为 25%,则 cap_percentage_resource 的有效 wgAdhoc 变为 75%。

了解工作负荷组运行时值的最简单方法是查询系统视图 sys.dm_workload_management_workload_groups_stats

权限

需要 CONTROL DATABASE 权限

请参阅