

# 适用于 RDS for SQL Server 的 Microsoft SQL Server 资源调控器
<a name="Appendix.SQLServer.Options.ResourceGovernor"></a>

资源调控器是 SQL Server 企业版的一项功能，可让您精确控制实例资源。它支持您对工作负载如何使用 CPU、内存和物理 I/O 资源设置特定的限制。使用资源调控器，您可以：
+ 通过管理不同工作负载共享实例资源的方式，防止在多租户环境中发生资源垄断
+ 通过为不同的用户和应用程序设置特定的资源限制和优先级，提供可预测的性能

您可以在现有或新的 RDS for SQL Server 数据库实例上启用资源调控器。

资源调控器使用三个基本概念：
+ **资源池**：管理实例物理资源（CPU、内存和 I/O）的容器。您将获得两个内置池（内部和默认），并且可以创建其它自定义池。
+ **工作负载组**：用于存放具有相似特征的数据库会话的容器。每个工作负载组都属于一个资源池。您将获得两个内置工作负载组（内部和默认），并且可以创建其它自定义工作负载组。
+ **分类**：根据用户名、应用程序名称、数据库名称或主机名，确定哪个工作负载组处理传入会话的过程。

有关 SQL Server 中资源调控器功能的更多详细信息，请参阅 Microsoft 文档中的 [Resource Governor](https://learn.microsoft.com/en-us/sql/relational-databases/resource-governor/resource-governor?view=sql-server-ver16)。

**Contents**
+ [支持的版本和区域](#ResourceGovernor.SupportedVersions)
+ [限制和建议](#ResourceGovernor.Limitations)
+ [对 RDS for SQL Server 实例启用 Microsoft SQL Server 资源调控器](ResourceGovernor.Enabling.md)
  + [为 `RESOURCE_GOVERNOR` 创建选项组](ResourceGovernor.Enabling.md#ResourceGovernor.OptionGroup)
  + [将 `RESOURCE_GOVERNOR` 选项添加到选项组](ResourceGovernor.Enabling.md#ResourceGovernor.Add)
  + [将选项组与数据库实例关联](ResourceGovernor.Enabling.md#ResourceGovernor.Apply)
+ [对 RDS for SQL Server 实例使用 Microsoft SQL Server 资源调控器](ResourceGovernor.Using.md)
  + [管理资源池](ResourceGovernor.Using.md#ResourceGovernor.ManageResourcePool)
    + [创建资源池](ResourceGovernor.Using.md#ResourceGovernor.CreateResourcePool)
    + [更改资源池](ResourceGovernor.Using.md#ResourceGovernor.AlterResourcePool)
    + [删除资源池](ResourceGovernor.Using.md#ResourceGovernor.DropResourcePool)
  + [管理工作负载组](ResourceGovernor.Using.md#ResourceGovernor.ManageWorkloadGroups)
    + [创建工作负载组](ResourceGovernor.Using.md#ResourceGovernor.CreateWorkloadGroup)
    + [更改工作负载组](ResourceGovernor.Using.md#ResourceGovernor.AlterWorkloadGroup)
    + [删除工作负载组](ResourceGovernor.Using.md#ResourceGovernor.DropWorkloadGroup)
  + [创建并注册分类器函数](ResourceGovernor.Using.md#ResourceGovernor.ClassifierFunction)
  + [删除分类器函数](ResourceGovernor.Using.md#ResourceGovernor.DropClassifier)
  + [注销分类器函数](ResourceGovernor.Using.md#ResourceGovernor.DeregisterClassifier)
  + [重置统计数据](ResourceGovernor.Using.md#ResourceGovernor.ResetStats)
  + [资源调控器配置更改](ResourceGovernor.Using.md#ResourceGovernor.ConfigChanges)
  + [将 TempDB 绑定到资源池](ResourceGovernor.Using.md#ResourceGovernor.BindTempDB)
  + [解除 TempDB 与资源池的绑定](ResourceGovernor.Using.md#ResourceGovernor.UnbindTempDB)
  + [清理资源调控器](ResourceGovernor.Using.md#ResourceGovernor.Cleanup)
+ [多可用区部署的注意事项](#ResourceGovernor.Considerations)
+ [只读副本的注意事项](#ResourceGovernor.ReadReplica)
+ [使用适用于 RDS for SQL Server 实例的系统视图监控 Microsoft SQL Server 资源调控器](ResourceGovernor.Monitoring.md)
  + [资源池运行时统计数据](ResourceGovernor.Monitoring.md#ResourceGovernor.ResourcePoolStats)
+ [对 RDS for SQL Server 实例禁用 Microsoft SQL Server 资源调控器](ResourceGovernor.Disabling.md)
+ [在 RDS for SQL Server 上配置资源调控器的最佳实践](ResourceGovernor.BestPractices.md)

## 支持的版本和区域
<a name="ResourceGovernor.SupportedVersions"></a>

在所有提供 RDS for SQL Server 的 AWS 区域中，Amazon RDS 对于以下 SQL Server 版本支持资源调控器：
+ SQL Server 2022 开发人员版和企业版
+ SQL Server 2019 企业版
+ SQL Server 2017 企业版
+ SQL Server 2016 企业版

## 限制和建议
<a name="ResourceGovernor.Limitations"></a>

以下限制和建议适用于资源调控器：
+ 版本和服务限制：
  + 仅在 SQL Server 企业版中可用。
  + 资源管理仅限于 SQL Server 数据库引擎。不支持将资源调控器用于分析服务、集成服务和报告服务。
+ 配置限制：
  + 必须使用 Amazon RDS 存储过程来实施所有配置。
  + 不支持原生 DDL 语句和 SQL Server Management Studio GUI 配置。
+ 资源池参数：
  + 不支持以 `rds_` 开头的池名称。
  + 不允许修改内部资源池和默认资源池。
  + 对于用户定义的资源池，不支持以下资源池参数：
    + `MIN_MEMORY_PERCENT`
    + `MIN_CPU_PERCENT`
    + `MIN_IOPS_PER_VOLUME`
    + `AFFINITY`
+ 工作负载组参数：
  + 不支持以 `rds_` 开头的工作负载组名称。
  + 不允许修改内部工作负载组。
  + 对于默认工作负载组：
    + 只可修改 `REQUEST_MAX_MEMORY_GRANT_PERCENT` 参数。
    + 对于默认工作负载组，`REQUEST_MAX_MEMORY_GRANT_PERCENT` 必须介于 1 到 70 之间。
    + 所有其它参数均已锁定，无法更改。
  + 用户定义的工作负载组支持修改所有参数。
+ 分类器函数限制：
  + 分类器函数根据指定的标准（用户名、数据库、主机或应用程序名称）将连接路由到自定义工作负载组。
  + 支持多达两个用户定义的工作负载组及其各自的路由条件。
  + 将标准与每个组内的 `AND` 条件相结合。
  + 每个工作负载组需要至少一个路由标准。
  + 仅支持上面列出的分类方法。
  + 函数名称必须以 `rg_classifier_` 开头。
  + 如果没有条件匹配，则使用默认组分配。

# 对 RDS for SQL Server 实例启用 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Enabling"></a>

通过向 RDS for SQL Server 数据库实例添加 `RESOURCE_GOVERNOR` 选项，启用资源调控器。使用以下过程：

1. 创建新的选项组或选择现有的选项组。

1. 将 `RESOURCE_GOVERNOR` 选项添加到该选项组。

1. 将选项组与数据库实例相关联。

**注意**  
通过选项组启用资源调控器不要求重启。

## 为 `RESOURCE_GOVERNOR` 创建选项组
<a name="ResourceGovernor.OptionGroup"></a>

要启用资源调控器，请创建或修改与您计划使用的 SQL Server 版本和数据库实例版本对应的选项组。要完成此过程，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="ResourceGovernor.OptionGroup.Console"></a>

使用以下过程创建适用于 SQL Server 企业版 2022 的选项组。

**创建选项组**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择**创建组**。

1. 在**创建选项组**窗口中，执行以下操作：

   1. 对于**名称**，输入选项组的名称，该名称在 AWS 账户内具有唯一性，例如 **resource-governor-ee-2022**。此名称只能包含字母、数字和连字符。

   1. 对于**描述**，输入选项组的简要描述，例如 **RESOURCE\$1GOVERNOR option group for SQL Server EE 2022**。此说明用于显示说明。

   1. 对于**引擎**，选择 **sqlserver-ee**。

   1. 对于**主引擎版本**，选择 **16.00**。

1. 选择**创建**。

### CLI
<a name="ResourceGovernor.OptionGroup.CLI"></a>

以下过程创建适用于 SQL Server 企业版 2022 的选项组。

**创建选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-option-group \
      --option-group-name resource-governor-ee-2022 \
      --engine-name sqlserver-ee \
      --major-engine-version 16.00 \
      --option-group-description "RESOURCE_GOVERNOR option group for SQL Server EE 2022"
  ```

  对于：Windows

  ```
  aws rds create-option-group ^
      --option-group-name resource-governor-ee-2022 ^
      --engine-name sqlserver-ee ^
      --major-engine-version 16.00 ^
      --option-group-description "RESOURCE_GOVERNOR option group for SQL Server EE 2022"
  ```

## 将 `RESOURCE_GOVERNOR` 选项添加到选项组
<a name="ResourceGovernor.Add"></a>

接下来，使用 AWS 管理控制台或 AWS CLI 将 `RESOURCE_GOVERNOR` 选项添加到您的选项组。

### 控制台
<a name="ResourceGovernor.Add.Console"></a>

**添加 RESOURCE\$1GOVERNOR 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择您刚创建的选项组（在此示例中为 **resource-governor-ee-2022**）。

1. 选择**添加选项**。

1. 在**选项详细信息**下，对于**选项名称**选择 **RESOURCE\$1GOVERNOR**。

1. 在 **计划 (Scheduling)** 下，选择是立即添加选项还是在下一个维护时段添加选项。

1. 选择**添加选项**。

### CLI
<a name="ResourceGovernor.Add.CLI"></a>

**添加 `RESOURCE_GOVERNOR` 选项。**
+ 将 `RESOURCE_GOVERNOR` 选项添加到该选项组。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-option-to-option-group \
      --option-group-name resource-governor-ee-2022 \
      --options "OptionName=RESOURCE_GOVERNOR" \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds add-option-to-option-group ^
      --option-group-name resource-governor-ee-2022 ^
      --options "OptionName=RESOURCE_GOVERNOR" ^
      --apply-immediately
  ```

## 将选项组与数据库实例关联
<a name="ResourceGovernor.Apply"></a>

要将 `RESOURCE_GOVERNOR` 选项组与数据库实例关联，请使用 AWS 管理控制台或 AWS CLI。

### 控制台
<a name="ResourceGovernor.Apply.Console"></a>

要完成激活资源调控器，请将 `RESOURCE_GOVERNOR` 选项组与新的或现有的数据库实例关联：
+ 对于新数据库实例，请在启动实例时将其关联。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。
+ 对于现有数据库实例，请通过修改实例将其关联。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

### CLI
<a name="ResourceGovernor.Apply.CLI"></a>

可以将 `RESOURCE_GOVERNOR` 选项组与新的或现有的数据库实例关联。

**使用 `RESOURCE_GOVERNOR` 选项组创建实例**
+ 指定创建选项组时使用的相同数据库引擎类型和主要版本。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds create-db-instance \
      --db-instance-identifier mytestsqlserverresourcegovernorinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-ee \
      --engine-version 16.00 \
      --license-model license-included \
      --allocated-storage 100 \
      --master-username admin \
      --master-user-password password \
      --storage-type gp2 \
      --option-group-name resource-governor-ee-2022
  ```

  对于：Windows

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mytestsqlserverresourcegovernorinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-ee ^
      --engine-version 16.00 ^
      --license-model license-included ^
      --allocated-storage 100 ^
      --master-username admin ^
      --master-user-password password ^
      --storage-type gp2 ^
      --option-group-name resource-governor-ee-2022
  ```

**修改实例并关联 `RESOURCE_GOVERNOR` 选项组**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mytestinstance \
      --option-group-name resource-governor-ee-2022 \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mytestinstance ^
      --option-group-name resource-governor-ee-2022 ^
      --apply-immediately
  ```

# 对 RDS for SQL Server 实例使用 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Using"></a>

在将资源调控器选项添加到选项组后，资源调控器尚未在数据库引擎级别处于活动状态。要完全启用资源调控器，必须使用 RDS for SQL Server 存储过程启用它，并创建所需的资源调控器对象。有关更多信息，请参阅 [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

首先，连接到 SQL Server 数据库，然后调用相应的 RDS for SQL Server 存储过程以完成配置。有关连接到数据库的说明，请参阅 [连接到 Microsoft SQL Server 数据库实例](USER_ConnectToMicrosoftSQLServerInstance.md)。

有关如何调用每个存储过程的说明，请参阅以下主题：

**Topics**
+ [管理资源池](#ResourceGovernor.ManageResourcePool)
+ [管理工作负载组](#ResourceGovernor.ManageWorkloadGroups)
+ [创建并注册分类器函数](#ResourceGovernor.ClassifierFunction)
+ [删除分类器函数](#ResourceGovernor.DropClassifier)
+ [注销分类器函数](#ResourceGovernor.DeregisterClassifier)
+ [重置统计数据](#ResourceGovernor.ResetStats)
+ [资源调控器配置更改](#ResourceGovernor.ConfigChanges)
+ [将 TempDB 绑定到资源池](#ResourceGovernor.BindTempDB)
+ [解除 TempDB 与资源池的绑定](#ResourceGovernor.UnbindTempDB)
+ [清理资源调控器](#ResourceGovernor.Cleanup)

## 管理资源池
<a name="ResourceGovernor.ManageResourcePool"></a>

### 创建资源池
<a name="ResourceGovernor.CreateResourcePool"></a>

一旦在选项组上启用了资源调控器，您就可以使用 `rds_create_resource_pool` 创建自定义资源池。这些池可让您将特定百分比的 CPU、内存和 IOPS 分配给不同的工作负载。

**用法**

```
USE [msdb]
EXEC dbo.rds_create_resource_pool    
    @pool_name=value,
    @MAX_CPU_PERCENT=value,
    @CAP_CPU_PERCENT=value,
    @MAX_MEMORY_PERCENT=value,
    @MAX_IOPS_PER_VOLUME=value
```

以下参数为必需参数：
+ `@group_name`：是现有的用户定义工作负载组的名称。
+ `@pool_name`：是资源池的用户定义名称。*pool\$1name* 是字母数字，最多可包含 128 个字符，在数据库引擎实例中必须是唯一的，并且必须符合数据库标识符规则。

以下参数可选：
+ `@MAX_CPU_PERCENT`：指定在出现 CPU 争用时，资源池中的所有请求可获得的最大平均 CPU 带宽。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@CAP_CPU_PERCENT`：指定资源池中的所有请求可获得的 CPU 带宽的硬上限。将最大 CPU 带宽级别限制为与指定的值相同。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_MEMORY_PERCENT`：指定此资源池中的请求可以使用的最大查询工作区内存量。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_IOPS_PER_VOLUME`：指定支持用于资源池的每个磁盘卷的最大每秒 I/O 操作数（IOPS）。支持的 *value* 范围介于 0 到 2^31-1（2147483647）之间。指定 0 可移除池的 IOPS 限制。默认值是 0。

**示例**

使用所有默认值创建资源池的示例：

```
--This creates resource pool 'SalesPool' with all default values
USE [msdb]
EXEC rds_create_resource_pool @pool_name = 'SalesPool';
     
--Apply changes
USE [msdb]
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
     
--Validate configuration
select * from sys.resource_governor_resource_pools
```

使用指定的不同参数创建资源池的示例：

```
--creates resource pool
USE [msdb]
EXEC dbo.rds_create_resource_pool    
@pool_name='analytics',
@MAX_CPU_PERCENT = 30,
@CAP_CPU_PERCENT = 40,
@MAX_MEMORY_PERCENT = 20;
            
--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
    
--Validate configuration
select * from sys.resource_governor_resource_pools
```

### 更改资源池
<a name="ResourceGovernor.AlterResourcePool"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_pool    
    @pool_name=value,
    @MAX_CPU_PERCENT=value,
    @CAP_CPU_PERCENT=value,
    @MAX_MEMORY_PERCENT=value,
    @MAX_IOPS_PER_VOLUME=value;
```

以下参数为必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。Amazon RDS SQL Server 不支持更改默认资源池。

至少必须指定其中一个可选参数：
+ `@MAX_CPU_PERCENT`：指定在出现 CPU 争用时，资源池中的所有请求可获得的最大平均 CPU 带宽。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@CAP_CPU_PERCENT`：指定资源池中的所有请求可获得的 CPU 带宽的硬上限。将最大 CPU 带宽级别限制为与指定的值相同。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_MEMORY_PERCENT`：指定此资源池中的请求可以使用的最大查询工作区内存量。*value* 是一个整数，默认设置为 100。支持的 *value* 范围介于 1 到 100 之间。
+ `@MAX_IOPS_PER_VOLUME`：指定支持用于资源池的每个磁盘卷的最大每秒 I/O 操作数（IOPS）。支持的 *value* 范围介于 0 到 2^31-1（2147483647）之间。指定 0 可移除池的 IOPS 限制。默认值是 0。

**示例**

```
--This alters resource pool
USE [msdb]
EXEC dbo.rds_alter_resource_pool    
    @pool_name='analytics',
    @MAX_CPU_PERCENT = 10,
    @CAP_CPU_PERCENT = 20,
    @MAX_MEMORY_PERCENT = 50;

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration.
select * from sys.resource_governor_resource_pools
```

### 删除资源池
<a name="ResourceGovernor.DropResourcePool"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_drop_resource_pool    
@pool_name=value;
```

以下参数是必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。

**注意**  
SQL Server 不支持删除内部资源池或默认资源池。

**示例**

```
--This drops resource pool
USE [msdb]
EXEC dbo.rds_drop_resource_pool    
@pool_name='analytics'

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
select * from sys.resource_governor_resource_pools
```

## 管理工作负载组
<a name="ResourceGovernor.ManageWorkloadGroups"></a>

使用 `rds_create_workload_group` 和 `rds_alter_workload_group` 创建和管理的工作负载组支持您为查询组设置重要性级别、内存授予和其它参数。

### 创建工作负载组
<a name="ResourceGovernor.CreateWorkloadGroup"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_create_workload_group 
@group_name = value, 
@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, 
@pool_name = value
```

以下参数为必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。
+ `@group_name`：是现有的用户定义工作负载组的名称。

以下参数可选：
+ `@IMPORTANCE`：指定请求在工作负载组中的相对重要性。默认值为 `MEDIUM`。
+ `@REQUEST_MAX_MEMORY_GRANT_PERCENT`：指定单个请求可以从池中占用的最大查询工作区内存量。*value* 是由 `MAX_MEMORY_PERCENT` 定义的资源池大小的百分比。默认值为 25。
+ `@REQUEST_MAX_CPU_TIME_SEC`：指定批处理请求可以使用的最大 CPU 时间量（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，这意味着无限制。
+ `@REQUEST_MEMORY_GRANT_TIMEOUT_SEC`：指定查询可以等待查询工作区内存中的内存授予变为可用的最长时间（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，此时使用基于查询成本的内部计算来确定最长时间。
+ `@MAX_DOP`：指定并行查询执行的最大并行度 (`MAXDOP`)。支持的 *value* 范围介于 0 到 64 之间。*value* 的默认设置为 0，此时使用全局设置。
+ `@GROUP_MAX_REQUESTS`：指定支持在工作负载组中同时执行的最大请求数。*value* 必须为 0 或正整数。*值*的默认设置为 0，支持无限制的请求。
+ `@pool_name` = 将工作负载组与由 *pool\$1name* 标识的用户定义资源池或 `default` 资源池相关联。如果未提供 *pool\$1name*，则工作负载组将与内置 `default` 池相关联。

**示例**

```
--This creates workload group named 'analytics'
USE msdb;
EXEC dbo.rds_create_workload_group 
    @group_name = 'analytics',
    @IMPORTANCE = 'HIGH',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT = 25, 
    @REQUEST_MAX_CPU_TIME_SEC = 0, 
    @REQUEST_MEMORY_GRANT_TIMEOUT_SEC = 0, 
    @MAX_DOP = 0, 
    @GROUP_MAX_REQUESTS = 0, 
    @pool_name = 'analytics';

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
  
--Validate configuration
select * from sys.resource_governor_workload_groups
```

### 更改工作负载组
<a name="ResourceGovernor.AlterWorkloadGroup"></a>

**用法**

```
EXEC msdb.dbo.rds_alter_workload_group
    @group_name = value,
    @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,
    @pool_name = value
```

以下参数为必需参数：
+ `@group_name`：是默认工作负载组或现有的用户定义工作负载组的名称。

**注意**  
仅支持更改默认工作负载组上的 `REQUEST_MAX_MEMORY_GRANT_PERCENT` 参数。对于默认工作负载组，`REQUEST_MAX_MEMORY_GRANT_PERCENT` 必须介于 1 到 70 之间。在默认工作负载组中不能修改其它参数。可以在用户定义的工作负载组中修改所有参数。

以下参数可选：
+ `@IMPORTANCE`：指定请求在工作负载组中的相对重要性。默认值为 MEDIUM。
+ `@REQUEST_MAX_MEMORY_GRANT_PERCENT`：指定单个请求可以从池中占用的最大查询工作区内存量。*value* 是由 `MAX_MEMORY_PERCENT` 定义的资源池大小的百分比。默认值为 25。在 Amazon RDS 上，`REQUEST_MAX_MEMORY_GRANT_PERCENT` 必须介于 1 到 70 之间。
+ `@REQUEST_MAX_CPU_TIME_SEC`：指定批处理请求可以使用的最大 CPU 时间量（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，这意味着无限制。
+ `@REQUEST_MEMORY_GRANT_TIMEOUT_SEC`：指定查询可以等待查询工作区内存中的内存授予变为可用的最长时间（秒）。*value* 必须为 0 或正整数。*value* 的默认设置为 0，此时使用基于查询成本的内部计算来确定最长时间。
+ `@MAX_DOP`：指定并行查询执行的最大并行度（MAXDOP）。支持的 *value* 范围介于 0 到 64 之间。*value* 的默认设置为 0，此时使用全局设置。
+ `@GROUP_MAX_REQUESTS`：指定支持在工作负载组中同时执行的最大请求数。*value* 必须为 0 或正整数。*值*的默认设置为 0，支持无限制的请求。
+ `@pool_name`：将工作负载组与由 *pool\$1name* 标识的用户定义资源池相关联。

**示例**

修改默认工作负载组以更改 REQUEST\$1MAX\$1MEMORY\$1GRANT\$1PERCENT 的示例：

```
--Modify default workload group (set memory grant cap to 10%)
USE msdb
EXEC dbo.rds_alter_workload_group    
    @group_name = 'default',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT=10;
    
--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
SELECT * FROM sys.resource_governor_workload_groups WHERE name='default';
```

修改非默认工作负载组的示例：

```
EXEC msdb.dbo.rds_alter_workload_group    
    @group_name = 'analytics',
    @IMPORTANCE = 'HIGH',
    @REQUEST_MAX_MEMORY_GRANT_PERCENT = 30,
    @REQUEST_MAX_CPU_TIME_SEC = 3600,
    @REQUEST_MEMORY_GRANT_TIMEOUT_SEC = 60,
    @MAX_DOP = 4,
    @GROUP_MAX_REQUESTS = 100;

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
```

将非默认工作负载组移到另一个资源池的示例：

```
EXEC msdb.dbo.rds_alter_workload_group    
@group_name = 'analytics',
@pool_name='abc'

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
select * from sys.resource_governor_workload_groups
```

### 删除工作负载组
<a name="ResourceGovernor.DropWorkloadGroup"></a>

**用法**

```
EXEC msdb.dbo.rds_drop_workload_group    
@group_name = value
```

以下参数为必需参数：
+ `@group_name`：是现有的用户定义工作负载组的名称。

**示例**

```
--Drops a Workload Group:
EXEC msdb.dbo.rds_drop_workload_group    
@group_name = 'analytics';

--Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;

--Validate configuration
select * from sys.resource_governor_workload_groups
```

## 创建并注册分类器函数
<a name="ResourceGovernor.ClassifierFunction"></a>

此过程在主数据库中创建资源调控器分类器函数，该函数根据指定的标准（用户名、数据库、主机或应用程序名称）将连接路由到自定义工作负载组。如果启用了资源调控器并在资源调控器配置中指定了分类器函数，则函数输出将决定用于新会话的工作负载组。在没有分类器函数的情况下，所有会话都归类到 `default` 组。

**设施特点：**
+ 支持多达两个工作负载组及其各自的路由条件。
+ 将标准与每个组内的 `AND` 条件相结合。
+ 每个工作负载组需要至少一个路由标准。
+ 函数名称必须以 `rg_classifier_` 开头。
+ 如果没有条件匹配，则使用默认组分配。

分类器函数具有以下特征和行为：
+ 该函数在服务器作用域（在主数据库中）中定义。
+ 该函数是通过架构绑定定义的。
+ 即使启用了连接池，也会为每个新会话评估该函数。
+ 该函数返回会话的工作负载组上下文。会话分配给分类器在会话生命周期内返回的工作负载组。
+ 如果函数返回 NULL、默认值或不存在的工作负载组的名称，则会话将获得默认的工作负载组上下文。如果函数因任何原因失败，也会为会话提供默认上下文。
+ 可以创建多个分类器函数。但是，SQL Server 支持一次只注册一个分类器函数。
+ 除非使用将函数名称设置为 NULL 的注销过程 (`EXEC dbo.msdb.rds_alter_resource_governor_configuration @deregister_function = 1;`) 来移除分类器状态，或者使用 (`EXEC dbo.msdb.rds_alter_resource_governor_configuration @classifier_function = <function_name>;`) 注册另一个分类器函数，否则无法删除分类器函数
+ 在没有分类器函数的情况下，所有会话都归类到默认组。
+ 在资源调控器配置中引用分类器函数时，您无法修改该函数。不过，您可以修改配置以使用不同的分类器函数。如果要对分类器进行更改，可以考虑创建一对分类器函数。例如，您可以创建 `rg_classifier_a` 和 `rg_classifier_b`。

**用法**

```
EXEC msdb.dbo.rds_create_classifier_function 
@function_name = value,
@workload_group1 = value, 
@user_name1 = value,
@db_name1 = value,
@host_name1 = value, 
@app_name1 = value, 
@workload_group2 = value,
@user_name2 = value,
@db_name2 = value,
@host_name2 = value,
@app_name2 = value
```

以下参数为必需参数：
+ `@function_name`：分类器函数的名称。必须以 `rg_classifier_` 开头
+ `@workload_group1`：第一个工作负载组的名称

以下参数可选：

（必须为组 1 指定其中至少一个标准）
+ `@user_name1`：组 1 的登录名
+ `@db_name1`：组 1 的数据库名称
+ `@host_name1`：组 1 的主机名
+ `@app_name1`：组 1 的应用程序名称

（如果指定组 2，则必须至少提供一个标准）
+ `@workload_group2`：第二个工作负载组的名称
+ `@user_name2`：组 2 的登录名
+ `@db_name2`：组 2 的数据库名称
+ `@host_name2`：组 2 的主机名
+ `@app_name2`：组 2 的应用程序名称

**注意**  
系统账户、数据库、应用程序和主机受到限制。

**示例**

一个工作负载组的基本示例：

```
/*Create a classifier to route all requests from 'PowerBI' app to workload group 
'reporting_group'*/

EXEC msdb.dbo.rds_create_classifier_function
@function_name = 'rg_classifier_a',
@workload_group1 = 'reporting_group',
@app_name1 = 'PowerBI';

--Register the classifier
EXEC msdb.dbo.rds_alter_resource_governor_configuration
@classifier_function = 'rg_classifier_a';

-- Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration

/*Query sys.resource_governor_configuration to validate that resource governor is enabled and is using the classifier function we created and registered*/

use master
go
SELECT OBJECT_SCHEMA_NAME(classifier_function_id) AS classifier_schema_name,
       OBJECT_NAME(classifier_function_id) AS classifier_object_name,
       is_enabled
FROM sys.resource_governor_configuration;
```

## 删除分类器函数
<a name="ResourceGovernor.DropClassifier"></a>

**用法**

```
USE [msdb]
EXEC dbo.rds_drop_classifier_function
@function_name = value;
```

以下参数是必需参数：
+ `@function_name`：是现有的用户定义分类器函数的名称

**示例**：

```
EXEC msdb.dbo.rds_drop_classifier_function
@function_name = 'rg_classifier_b';
```

## 注销分类器函数
<a name="ResourceGovernor.DeregisterClassifier"></a>

使用此过程可注销分类器函数。注销该函数后，新的会话将自动分配给默认工作负载组。

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_governor_configuration    
@deregister_function = 1;
```

要注销，需要使用以下参数：
+ `@deregister_function` 必须为 1

**示例**：

```
EXEC msdb.dbo.rds_alter_resource_governor_configuration 
    @deregister_function = 1;
GO

-- Apply changes
EXEC msdb.dbo.rds_alter_resource_governor_configuration;
```

## 重置统计数据
<a name="ResourceGovernor.ResetStats"></a>

资源调控器统计数据是自上次服务器重新启动以来的累积数据。如果您需要从特定时间开始收集统计数据，则可以使用以下 Amazon RDS 存储过程来重置统计数据。

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_governor_configuration  
@reset_statistics = 1;
```

要重置统计数据，需要使用以下参数：
+ `@reset_statistics` 必须为 1

## 资源调控器配置更改
<a name="ResourceGovernor.ConfigChanges"></a>

如果未启用资源调控器，则 `rds_alter_resource_governor_configuration` 启用资源调控器。启用资源调控器会产生以下结果：
+ 对新会话执行分类器函数（如果有），并将会话分配给工作负载组。
+ 在资源调控器配置中指定的资源限制将得到遵守和执行。
+ 在资源调控器配置中指定的资源限制将得到遵守和执行。
+ 在启用资源调控器之前存在的请求可能会受到启用资源调控器时所做的任何配置更改的影响。
+ 启用资源调控器之前的现有请求可能会受到启用资源调控器时所做的任何配置更改的影响。
+ 在 RDS for SQL Server 上，必须执行 `EXEC msdb.dbo.rds_alter_resource_governor_configuration` 才能使任何资源调控器配置更改生效。

**用法**

```
USE [msdb]
EXEC dbo.rds_alter_resource_governor_configuration
```

## 将 TempDB 绑定到资源池
<a name="ResourceGovernor.BindTempDB"></a>

在 Amazon RDS SQL Server 版本 2019 及更高版本中，您可以使用 `rds_bind_tempdb_metadata_to_resource_pool` 将 tempdb 内存优化型元数据绑定到特定的资源池。

**注意**  
在将 tempdb 元数据绑定到资源池之前，必须启用内存优化型 tempdb 元数据功能。要在 Amazon RDS 上启用此功能，需要使用静态参数 `tempdb metadata memory-optimized`。

在 Amazon RDS 上启用静态参数，并在不进行失效转移的情况下执行重启以使该参数生效：

```
aws rds modify-db-parameter-group \
    --db-parameter-group-name test-sqlserver-ee-2022 \
    --parameters "ParameterName='tempdb metadata memory-optimized',ParameterValue=True,ApplyMethod=pending-reboot"
```

**用法**

```
USE [msdb]
EXEC dbo.rds_bind_tempdb_metadata_to_resource_pool  
@pool_name=value;
```

以下参数是必需参数：
+ `@pool_name`：是现有的用户定义资源池的名称。

**注意**  
即使内存优化型 TempDB 元数据功能已启用，此更改也需要在不进行失效转移的情况下重启 sql 服务才能生效。

## 解除 TempDB 与资源池的绑定
<a name="ResourceGovernor.UnbindTempDB"></a>

从资源池中解除绑定 tempdb 内存优化型元数据。

**注意**  
此更改也要求在不进行失效转移的情况下重启 sql 服务才能生效

**用法**

```
USE [msdb]
EXEC dbo.rds_unbind_tempdb_metadata_from_resource_pool
```

## 清理资源调控器
<a name="ResourceGovernor.Cleanup"></a>

此过程将在您从选项组中移除资源调控器选项后，清理所有关联的对象。这将禁用资源调控器，将默认工作负载组恢复为默认设置，移除自定义工作负载组、资源池和分类器函数。

**主要特征**
+ 将默认工作负载组恢复为默认设置
+ 禁用资源调控器
+ 移除自定义工作负载组
+ 移除自定义资源池
+ 删除分类器函数
+ 如果启用，则移除 tempdb 资源池绑定

**重要**  
如果工作负载组上有活动的会话，则此清理可能会出错。要么等待活动的会话完成，要么根据您的业务要求终止活动的会话。建议在维护时段运行此操作。  
如果资源池已绑定到 tempdb，并且尚未在没有进行失效转移的情况下重启，则此清理可能会出错。如果您之前将资源池绑定到 tempdb 或解除了资源池与 tempdb 的绑定，请在不进行失效转移的情况下执行重启以使更改生效。建议在维护时段运行此操作。

**用法**

```
USE [msdb]
EXEC dbo.rds_cleanup_resource_governor
```

## 多可用区部署的注意事项
<a name="ResourceGovernor.Considerations"></a>

RDS for SQL Server 将资源调控器复制到多可用区部署中的辅助实例。您可以验证修改时间以及新的资源调控器上次与辅助实例同步的时间。

使用以下查询来检查复制的 `last_sync_time`：

```
SELECT * from msdb.dbo.rds_fn_server_object_last_sync_time();
```

在查询结果中，如果同步时间超过了资源调控器更新或创建时间，则资源调控器将与辅助实例同步。

要执行手动数据库失效转移以确认资源调控器复制，请先等待 `last_sync_time` 进行更新。然后，继续进行多可用区失效转移。

## 只读副本的注意事项
<a name="ResourceGovernor.ReadReplica"></a>
+ 对于与源数据库实例位于同一区域的 SQL Server 副本，请使用与源相同的选项组。对选项组的更改会立即传播到副本，而不考虑其维护时段。
+ 当您创建 SQL Server 跨区域副本时，RDS 会为其创建专用选项组。
+ 您无法从专用选项组中删除 SQL Server 跨区域副本。任何其他数据库实例都无法使用 SQL Server 跨区域副本的专用选项组。
+ 资源调控器选项为非复制的选项。您可以在专用选项组中添加或删除未复制的选项。
+ 提升 SQL Server 跨区域只读副本时，提升后的副本的行为与其他 SQL Server 数据库实例相同，包括其选项的管理。

**注意**  
当在只读副本上使用资源调控器时，在将选项添加到选项组后，您必须手动确保已使用 Amazon RDS 存储过程在只读副本上配置了资源调控器。资源调控器配置不会自动复制到只读副本。此外，只读副本上的工作负载通常与主实例不同。因此，建议根据您的工作负载和实例类型在副本上应用资源配置。您可以在只读副本上独立运行这些 Amazon RDS 存储过程，以便在只读副本上配置资源调控器。

# 使用适用于 RDS for SQL Server 实例的系统视图监控 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Monitoring"></a>

资源调控器统计数据是自上次服务器重新启动以来的累积数据。如果您需要从特定时间开始收集统计数据，则可以使用以下 Amazon RDS 存储过程来重置统计数据：

```
EXEC msdb.dbo.rds_alter_resource_governor_configuration  
@reset_statistics = 1;
```

## 资源池运行时统计数据
<a name="ResourceGovernor.ResourcePoolStats"></a>

对于每个资源池，资源调控器会跟踪 CPU 和内存利用率、内存不足事件、内存授予、I/O 以及其它统计数据。有关更多信息，请参阅 [ sys.dm\$1resource\$1governor\$1resource\$1pools](https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-resource-governor-resource-pools-transact-sql?view=sql-server-ver17)。

以下查询返回所有资源池的可用统计数据的子集：

```
SELECT rp.pool_id,
       rp.name AS resource_pool_name,
       wg.workload_group_count,
       rp.statistics_start_time,
       rp.total_cpu_usage_ms,
       rp.target_memory_kb,
       rp.used_memory_kb,
       rp.out_of_memory_count,
       rp.active_memgrant_count,
       rp.total_memgrant_count,
       rp.total_memgrant_timeout_count,
       rp.read_io_completed_total,
       rp.write_io_completed_total,
       rp.read_bytes_total,
       rp.write_bytes_total,
       rp.read_io_stall_total_ms,
       rp.write_io_stall_total_ms
FROM sys.dm_resource_governor_resource_pools AS rp
OUTER APPLY (
            SELECT COUNT(1) AS workload_group_count
            FROM sys.dm_resource_governor_workload_groups AS wg
            WHERE wg.pool_id = rp.pool_id
            ) AS wg;
```

# 对 RDS for SQL Server 实例禁用 Microsoft SQL Server 资源调控器
<a name="ResourceGovernor.Disabling"></a>

在 RDS for SQL Server 上禁用资源调控器后，该服务将停止管理工作负载资源。在禁用资源调控器之前，请查看这会如何影响您的数据库连接和配置。

禁用资源调控器会产生以下结果：
+ 打开新连接时不会执行分类器函数。
+ 新连接会自动分类到默认工作负载组。
+ 所有现有的工作负载组和资源池设置都将重置为其默认值。
+ 达到限制时不会触发任何事件。
+ 可以对资源调控器配置进行更改，但只有在启用资源调控器后，更改才会生效。

要禁用资源调控器，请从其选项组中移除 `RESOURCE_GOVERNOR` 选项。

## 控制台
<a name="ResourceGovernor.Disabling.Console"></a>

以下过程删除 `RESOURCE_GOVERNOR` 选项。

**从其选项组中删除 RESOURCE\$1GOVERNOR 选项**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

1. 选择具有 `RESOURCE_GOVERNOR` 选项的选项组（在前面的示例中为 `resource-governor-ee-2022`）。

1. 选择 **Delete option (删除选项)**。

1. 在**删除选项**下，为**待删除的选项**选择 **RESOURCE\$1GOVERNOR**。

1. 在 **Apply immediately**（立即应用）下，选择 **Yes**（是）可立即删除选项，选择 **No**（否）可在下一个维护时段删除它。

1. 选择**删除**。

## CLI
<a name="ResourceGovernor.Disabling.CLI"></a>

以下过程删除 `RESOURCE_GOVERNOR` 选项。

**从其选项组中删除 RESOURCE\$1GOVERNOR 选项**
+ 运行以下命令之一。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds remove-option-from-option-group \
      --option-group-name resource-governor-ee-2022 \
      --options RESOURCE_GOVERNOR \
      --apply-immediately
  ```

  对于：Windows

  ```
  aws rds remove-option-from-option-group ^
      --option-group-name resource-governor-ee-2022 ^
      --options RESOURCE_GOVERNOR ^
      --apply-immediately
  ```

# 在 RDS for SQL Server 上配置资源调控器的最佳实践
<a name="ResourceGovernor.BestPractices"></a>

为了控制资源消耗，RDS for SQL Server 支持 Microsoft SQL Server 资源调控器。以下最佳实践有助于您避免常见的配置问题并优化数据库性能。

1. 资源调控器配置存储在 `master` 数据库中。我们建议您始终单独保存资源调控器配置脚本的一个副本。

1. 分类器函数延长了登录处理时间，因此建议避免在分类器中使用复杂的逻辑。过于复杂的函数可能会导致登录延迟或连接超时，包括 Amazon RDS 自动化会话。这可能会影响 Amazon RDS 自动化功能监控实例运行状况的能力。因此，始终建议在生产环境中实现分类器函数之前，先在预生产环境中测试分类器函数。

1. 避免在工作负载组中为 `REQUEST_MAX_MEMORY_GRANT_PERCENT` 设置较高的值（大于 70），因为这会阻止数据库实例为其它并发查询分配足够的内存，从而可能导致内存授予超时错误（错误 8645）。相反，如果将此值设置为过低（小于 1）或设置为 0，则可能会阻止需要内存工作区的查询（例如涉及排序或哈希操作的查询）在用户定义的工作负载组中正常执行。RDS 通过在默认工作负载组上将值限制在 1 到 70 之间，来强制实施这些限制。

1. 要将 tempdb 绑定到资源池，在将内存优化型 tempdb 元数据绑定到池后，池可能会达到其最大设置，并且使用 `tempdb` 的任何查询都可能因内存不足错误而失败。在某些情况下，如果发生内存不足错误，SQL Server 可能会停止。要减少发生这种情况的机会，请将内存池的 `MAX_MEMORY_PERCENT` 设置为较高的值。