

# RDS for SQL Server를 사용한 Microsoft SQL Server 리소스 관리
<a name="Appendix.SQLServer.Options.ResourceGovernor"></a>

리소스 거버너는 인스턴스 리소스를 정확하게 제어할 수 있는 SQL Server Enterprise Edition 기능입니다. 이를 통해 워크로드가 CPU, 메모리 및 물리적 I/O 리소스를 사용하는 방식에 대한 특정 제한을 설정할 수 있습니다. 리소스 거버너를 사용하면 다음을 수행할 수 있습니다.
+ 다양한 워크로드가 인스턴스 리소스를 공유하는 방식을 관리하여 다중 테넌트 환경에서 리소스 독점 방지
+ 다양한 사용자 및 애플리케이션에 대한 특정 리소스 제한 및 우선 순위를 설정하여 예측 가능한 성능 제공

기존 또는 새 RDS for SQL Server DB 인스턴스에서 리소스 거버너를 활성화할 수 있습니다.

리소스 거버너는 세 가지 기본 개념을 사용합니다.
+ **리소스 풀** - 인스턴스 물리적 리소스(CPU, 메모리 및 I/O)를 관리하는 컨테이너입니다. 두 개의 기본 제공 풀(내부 및 기본)을 가져오고 추가 사용자 지정 풀을 생성할 수 있습니다.
+ **워크로드 그룹** - 특성이 유사한 데이터베이스 세션용 컨테이너입니다. 모든 워크로드 그룹은 리소스 풀에 속합니다. 두 개의 기본 제공 워크로드 그룹(내부 및 기본)을 가져오고 추가 사용자 지정 워크로드 그룹을 생성할 수 있습니다.
+ **분류** - 사용자 이름, 애플리케이션 이름, 데이터베이스 이름 또는 호스트 이름을 기반으로 수신 세션을 처리하는 워크로드 그룹을 결정하는 프로세스입니다.

SQL Server의 리소스 거버너에 대한 자세한 내용은 Microsoft 설명서의 [리소스 거버너](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)
  + [

## 옵션 그룹을 DB 인스턴스와 연결
](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)
+ [

## 다중 AZ 배포에 대한 고려 사항
](#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>

Amazon RDS는 RDS for SQL Server를 사용할 수 있는 모든 AWS 리전에서 다음 SQL Server 버전 및 에디션에 대한 리소스 조절을 지원합니다.
+ SQL Server 2022 Developer Edition 및 Enterprise Edition
+ SQL Server 2019 Enterprise Edition
+ SQL Server 2017 Enterprise Edition
+ SQL Server 2016 Enterprise Edition

## 제한 및 권장 사항
<a name="ResourceGovernor.Limitations"></a>

리소스 거버너에는 다음과 같은 제한 사항 및 권장 사항이 적용됩니다.
+ 에디션 및 서비스 제한:
  + SQL Server Enterprise Edition에서만 사용할 수 있습니다.
  + 리소스 관리는 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 사이여야 합니다.
    + 다른 모든 파라미터는 잠겨 있으며 변경할 수 없습니다.
  + 사용자 정의 워크로드 그룹을 사용하면 모든 파라미터를 수정할 수 있습니다.
+ 분류자 함수 제한 사항:
  + 분류자 함수는 지정된 기준(사용자 이름, 데이터베이스, 호스트 또는 애플리케이션 이름)에 따라 사용자 지정 워크로드 그룹에 연결을 라우팅합니다.
  + 각 라우팅 조건에서 최대 2개의 사용자 정의 워크로드 그룹을 지원합니다.
  + 기준을 각 그룹 내의 `AND` 조건과 결합합니다.
  + 워크로드 그룹당 하나 이상의 라우팅 기준이 필요합니다.
  + 위에 나열된 분류 방법만 지원됩니다.
  + 함수 이름은 `rg_classifier_`로 시작해야 합니다.
  + 일치하는 조건이 없는 경우 기본 그룹 할당입니다.

# RDS for SQL Server 인스턴스에 대한 Microsoft SQL Server 리소스 거버너 활성화
<a name="ResourceGovernor.Enabling"></a>

RDS for SQL Server DB 인스턴스에 `RESOURCE_GOVERNOR` 옵션을 추가하여 리소스 거버너를 활성화합니다. 다음 프로세스를 사용합니다.

1. 새 옵션 그룹을 생성하거나 기존 옵션 그룹을 선택합니다.

1. [`RESOURCE_GOVERNOR`] 옵션을 옵션 그룹에 추가합니다.

1. 옵션 그룹을 DB 인스턴스에 연결합니다.

**참고**  
옵션 그룹을 통해 리소스 거버너를 활성화하면 재부팅할 필요가 없습니다.

## `RESOURCE_GOVERNOR`용 옵션 그룹 만들기
<a name="ResourceGovernor.OptionGroup"></a>

리소스 거버너를 활성화하려면 사용할 DB 인스턴스의 SQL Server 에디션 및 버전에 해당하는 옵션 그룹을 생성하거나 수정합니다. 이 절차를 완료하려면 AWS Management Console 또는 AWS CLI를 사용합니다.

### 콘솔
<a name="ResourceGovernor.OptionGroup.Console"></a>

다음 절차를 사용하여 SQL Server Enterprise Edition 2022에 대한 옵션 그룹을 생성합니다.

**옵션 그룹을 생성하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **옵션 그룹**을 선택합니다.

1. **그룹 생성**을 선택합니다.

1. **보안 그룹 생성** 창에서 다음과 같이 합니다.

   1. [**이름(Name)**]에 AWS 계정 내에서 쉽게 식별할 수 있는 옵션 그룹 이름을 입력합니다(예: **resource-governor-ee-2022**). 이름은 글자, 숫자 및 하이픈만 사용 가능합니다.

   1. **설명**에 옵션 그룹에 대한 간단한 설명을 입력합니다(예: **RESOURCE\$1GOVERNOR option group for SQL Server EE 2022**). 이 설명은 표시 용도로만 사용됩니다.

   1. **엔진**에 대해 **sqlserver-ee**를 선택합니다.

   1. **메이저 엔진 버전**에 대해 **16.00**을 선택합니다.

1. **생성(Create)**을 선택합니다.

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

다음 절차에서는 SQL Server Enterprise Edition 2022에 대한 옵션 그룹을 생성합니다.

**옵션 그룹을 생성하려면**
+ 다음 명령 중 하나를 실행합니다.  
**Example**  

  대상 LinuxmacOS, 또는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 Management Console 또는 AWS CLI를 사용하여 `RESOURCE_GOVERNOR` 옵션을 옵션 그룹에 추가합니다.

### 콘솔
<a name="ResourceGovernor.Add.Console"></a>

**RESOURCE\$1GOVERNOR 옵션 추가**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **옵션 그룹**을 선택합니다.

1. 이 예제에서는 방금 생성한 옵션 그룹인 **resource-governor-ee-2022**를 선택합니다.

1. **옵션 추가**를 선택합니다.

1. **옵션 세부 정보**에서 **옵션 이름**으로 **RESOURCE\$1GOVERNOR**를 선택합니다.

1. **예약**에서 옵션을 즉시 추가할지 또는 다음 유지 관리 기간에 추가할지를 선택합니다.

1. **옵션 추가**를 선택합니다.

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

**`RESOURCE_GOVERNOR` 옵션을 추가하려면**
+ [`RESOURCE_GOVERNOR`] 옵션을 옵션 그룹에 추가합니다.  
**Example**  

  대상 LinuxmacOS, 또는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
  ```

## 옵션 그룹을 DB 인스턴스와 연결
<a name="ResourceGovernor.Apply"></a>

AWS Management Console 또는 AWS CLI를 사용하여 `RESOURCE_GOVERNOR` 옵션 그룹을 DB 인스턴스와 연결할 수 있습니다.

### 콘솔
<a name="ResourceGovernor.Apply.Console"></a>

리소스 거버너 활성화를 완료하려면 `RESOURCE_GOVERNOR` 옵션 그룹을 새 DB 인스턴스 또는 기존 DB 인스턴스와 연결합니다.
+ 새 DB 인스턴스의 경우 인스턴스를 시작할 때 이러한 그룹을 연결합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 섹션을 참조하세요.
+ 기존 DB 인스턴스의 경우 인스턴스를 수정하여 그룹을 연결합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 섹션을 참조하세요.

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

`RESOURCE_GOVERNOR` 옵션 그룹을 새 DB 인스턴스 또는 기존 DB 인스턴스와 연결할 수 있습니다.

**`RESOURCE_GOVERNOR` 옵션 그룹을 사용하여 인스턴스 생성**
+ 옵션 그룹을 생성할 때 사용한 것과 동일한 DB 엔진 유형과 메이저 버전을 지정합니다.  
**Example**  

  대상 LinuxmacOS, 또는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**  

  대상 LinuxmacOS, 또는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 DB 인스턴스에 연결](USER_ConnectToMicrosoftSQLServerInstance.md) 섹션을 참조하세요.

먼저 SQL Server 데이터베이스에 연결한 다음 적절한 RDS for SQL Server 저장 프로시저를 직접적으로 호출하여 구성을 완료합니다. 데이터베이스 연결 방법에 대한 자세한 내용은 [Microsoft SQL Server DB 인스턴스에 연결](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 대역폭을 지정합니다. *값*은 기본 설정이 100인 정수입니다. *값*에 허용되는 범위는 1\$1100입니다.
+ `@CAP_CPU_PERCENT` - 리소스 풀의 모든 요청이 수신하는 CPU 대역폭에 대한 하드 캡을 지정합니다. 최대 CPU 대역폭 수준을 지정된 값과 동일하게 제한합니다. *값*은 기본 설정이 100인 정수입니다. *값*에 허용되는 범위는 1\$1100입니다.
+ `@MAX_MEMORY_PERCENT` - 이 리소스 풀의 요청이 사용할 수 있는 쿼리 워크스페이스 메모리의 최대 양을 지정합니다. *값*은 기본 설정이 100인 정수입니다. *값*에 허용되는 범위는 1\$1100입니다.
+ `@MAX_IOPS_PER_VOLUME` - 리소스 풀을 허용할 디스크 볼륨당 최대 초당 I/O 작업 수(IOPS)를 지정합니다. *값*에 허용되는 범위는 0\$12^31-1(2,147,483,647)입니다. 풀에 대한 IOPS 제한을 제거하려면 0을 지정합니다. 기본값은 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 대역폭을 지정합니다. *값*은 기본 설정이 100인 정수입니다. *값*에 허용되는 범위는 1\$1100입니다.
+ `@CAP_CPU_PERCENT` - 리소스 풀의 모든 요청이 수신하는 CPU 대역폭에 대한 하드 캡을 지정합니다. 최대 CPU 대역폭 수준을 지정된 값과 동일하게 제한합니다. *값*은 기본 설정이 100인 정수입니다. *값*에 허용되는 범위는 1\$1100입니다.
+ `@MAX_MEMORY_PERCENT` - 이 리소스 풀의 요청이 사용할 수 있는 쿼리 워크스페이스 메모리의 최대 양을 지정합니다. *값*은 기본 설정이 100인 정수입니다. *값*에 허용되는 범위는 1\$1100입니다.
+ `@MAX_IOPS_PER_VOLUME` - 리소스 풀을 허용할 디스크 볼륨당 최대 초당 I/O 작업 수(IOPS)를 지정합니다. *값*에 허용되는 범위는 0\$12^31-1(2,147,483,647)입니다. 풀에 대한 IOPS 제한을 제거하려면 0을 지정합니다. 기본값은 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` - 단일 요청이 풀에서 가져올 수 있는 쿼리 워크스페이스 메모리의 최대 양을 지정합니다. *값*은 `MAX_MEMORY_PERCENT`에서 정의한 리소스 풀 크기의 백분율입니다. 기본값은 25입니다.
+ `@REQUEST_MAX_CPU_TIME_SEC` - 배치 요청이 사용할 수 있는 최대 CPU 시간을 초 단위로 지정합니다. *값*은 0 또는 양의 정수여야 합니다. *값*의 기본 설정은 0이며 이는 무제한을 의미합니다.
+ `@REQUEST_MEMORY_GRANT_TIMEOUT_SEC` - 쿼리가 쿼리 작업 영역 메모리의 메모리 부여를 사용할 수 있을 때까지 기다릴 수 있는 최대 시간을 초 단위로 지정합니다. *값*은 0 또는 양의 정수여야 합니다. *값*의 기본 설정인 0은 쿼리 비용을 기반으로 한 내부 계산을 사용하여 최대 시간을 결정합니다.
+ `@MAX_DOP` - 병렬 쿼리 실행을 위한 최대 병렬 처리 정도(`MAXDOP`)를 지정합니다. *값*에 허용되는 범위는 0\$164입니다. *값*의 기본 설정인 0은 전역 설정을 사용합니다.
+ `@GROUP_MAX_REQUESTS` = 워크로드 그룹에서 실행할 수 있는 최대 동시 요청 수를 지정합니다. *값*은 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` - 단일 요청이 풀에서 가져올 수 있는 쿼리 워크스페이스 메모리의 최대 양을 지정합니다. *값*은 `MAX_MEMORY_PERCENT`에서 정의한 리소스 풀 크기의 백분율입니다. 기본값은 25입니다. Amazon RDS에서 `REQUEST_MAX_MEMORY_GRANT_PERCENT`는 1에서 70 사이여야 합니다.
+ `@REQUEST_MAX_CPU_TIME_SEC` - 배치 요청이 사용할 수 있는 최대 CPU 시간을 초 단위로 지정합니다. *값*은 0 또는 양의 정수여야 합니다. *값*의 기본 설정은 0이며 이는 무제한을 의미합니다.
+ `@REQUEST_MEMORY_GRANT_TIMEOUT_SEC` - 쿼리가 쿼리 작업 영역 메모리의 메모리 부여를 사용할 수 있을 때까지 기다릴 수 있는 최대 시간을 초 단위로 지정합니다. *값*은 0 또는 양의 정수여야 합니다. *값*의 기본 설정인 0은 쿼리 비용을 기반으로 한 내부 계산을 사용하여 최대 시간을 결정합니다.
+ `@MAX_DOP` - 병렬 쿼리 실행을 위한 최대 병렬 처리 정도(MAXDOP)를 지정합니다. *값*에 허용되는 범위는 0\$164입니다. *값*의 기본 설정인 0은 전역 설정을 사용합니다.
+ `@GROUP_MAX_REQUESTS` - 워크로드 그룹에서 실행할 수 있는 최대 동시 요청 수를 지정합니다. *값*은 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` 그룹으로 분류됩니다.

**기능:**
+ 각 라우팅 조건에서 최대 2개의 워크로드 그룹을 지원합니다.
+ 기준을 각 그룹 내의 `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
```

## 다중 AZ 배포에 대한 고려 사항
<a name="ResourceGovernor.Considerations"></a>

RDS for SQL Server는 다중 AZ 배포에서 리소스 거버너를 보조 인스턴스에 복제합니다. 수정된 시기와 보조 인스턴스와 마지막으로 동기화된 새 리소스 거버너를 확인할 수 있습니다.

다음 쿼리를 사용하여 복제의 `last_sync_time`을 확인합니다.

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

쿼리 결과에서 동기화 시간이 리소스 조정자 업데이트 또는 생성 시간을 초과하면 리소스 조정자는 보조와 동기화됩니다.

수동 DB 장애 조치를 수행하여 리소스 준수 복제를 확인하려면 `last_sync_time`이 먼저 업데이트될 때까지 기다립니다. 그런 다음 다중 AZ 장애 조치를 진행합니다.

## 읽기 전용 복제본에 대한 고려 사항
<a name="ResourceGovernor.ReadReplica"></a>
+ 소스 DB 인스턴스와 동일한 리전에 있는 SQL Server 복제본의 경우 소스와 동일한 옵션 그룹을 사용합니다. 옵션 그룹에 대한 변경 사항은 유지 관리 기간에 관계없이 즉시 복제본으로 전파됩니다.
+ SQL Server 리전 간 복제본을 생성하면 RDS가 전용 옵션 그룹을 생성합니다.
+ 전용 옵션 그룹에서 SQL Server 리전 간 복제본을 제거할 수 없습니다. 다른 DB 인스턴스는 SQL Server 리전 간 복제본에 전용 옵션 그룹을 사용할 수 없습니다.
+ 리소스 거버너 옵션은 복제되지 않은 옵션입니다. 전용 옵션 그룹에 복제되지 않은 옵션을 추가하거나 제거할 수 있습니다.
+ SQL Server 리전 간 읽기 전용 복제본을 승격하면 승격된 복제본은 옵션 관리를 포함해 다른 SQL Server DB 인스턴스와 동일하게 작동합니다.

**참고**  
읽기 전용 복제본에서 리소스 거버너를 사용하는 경우 옵션을 옵션 그룹에 추가한 후 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 Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **옵션 그룹**을 선택합니다.

1. `RESOURCE_GOVERNOR` 옵션이 있는 옵션 그룹을 선택합니다(이전 예제의 경우 `resource-governor-ee-2022`).

1. **옵션 삭제**를 선택합니다.

1. **삭제 옵션**에서 **삭제할 옵션**으로 **RESOURCE\$1GOVERNOR**를 선택합니다.

1. **Apply immediately**(즉시 적용)에서 **Yes**(예)를 선택하여 옵션을 즉시 삭제하거나 **No**(아니오)를 선택하여 다음 유지 관리 기간에 삭제합니다.

1. **삭제**를 선택합니다.

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

다음 절차에서는 `RESOURCE_GOVERNOR` 옵션을 제거합니다.

**옵션 그룹에서 RESOURCE\$1GOVERNOR 옵션 제거**
+ 다음 명령 중 하나를 실행합니다.  
**Example**  

  대상 LinuxmacOS, 또는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\$170으로 제한하여 이러한 제한을 적용합니다.

1. tempdb를 리소스 풀에 바인딩하는 경우 메모리 최적화 tempdb 메타데이터를 풀에 바인딩한 후 풀이 최대 설정에 도달할 수 있으며 `tempdb`를 사용하는 쿼리는 out-of-memory 오류로 인해 실패할 수 있습니다. 경우에 따라 메모리 부족 오류가 발생할 경우 SQL Server가 중지될 수 있습니다. 이러한 일이 발생할 가능성을 줄이려면 메모리 풀의 `MAX_MEMORY_PERCENT`를 높은 값으로 설정합니다.