메모리 최적화 테이블이 있는 데이터베이스를 리소스 풀에 바인딩

적용 대상:SQL Server

리소스 풀은 관리할 수 있는 물리적 리소스의 하위 집합을 나타냅니다. 기본적으로 SQL Server 데이터베이스는 기본 리소스 풀의 리소스에 바인딩되고 사용됩니다. SQL Server가 하나 이상의 메모리 최적화 테이블에서 리소스를 사용하는 것을 방지하고 다른 메모리 사용자가 메모리 최적화 테이블에 필요한 메모리를 소비하지 않도록 하려면 메모리 최적화 테이블을 사용하여 데이터베이스에 대한 메모리 사용량을 관리하기 위해 별도의 리소스 풀을 만들어야 합니다.

데이터베이스는 하나의 리소스 풀에만 바인딩할 수 있습니다. 하지만 동일한 풀에 여러 데이터베이스를 바인딩할 수 있습니다. SQL Server는 메모리 최적화 테이블 없이 데이터베이스를 리소스 풀에 바인딩할 수 있지만 아무런 영향을 주지 않습니다. 나중에 데이터베이스에 메모리 최적화 테이블을 만들려면 명명된 리소스 풀에 데이터베이스를 바인딩합니다.

데이터베이스를 리소스 풀에 바인딩하려면 먼저 데이터베이스와 리소스 풀이 있어야 합니다. 바인딩은 다음에 데이터베이스가 온라인 상태가 될 때 적용됩니다. 자세한 내용은 데이터베이스 상태를 참조하세요.

리소스 풀에 대한 자세한 내용은 Resource Governor 리소스 풀을 참조 하세요.

데이터베이스를 리소스 풀에 바인딩하는 단계

  1. 데이터베이스 및 리소스 풀 만들기

    1. 데이터베이스 만들기

    2. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 최소값 결정

    3. 리소스 풀 만들기 및 메모리 구성

  2. 풀에 데이터베이스 바인딩

  3. 바인딩 확인

  4. 바인딩 적용

이 항목의 다른 콘텐츠

데이터베이스 및 리소스 풀 만들기

어떤 순서로든 데이터베이스 및 리소스 풀을 만들 수 있습니다. 중요한 것은 데이터베이스를 리소스 풀에 바인딩하기 전에 둘 다 존재한다는 것입니다.

데이터베이스 생성

다음 Transact-SQL은 하나 이상의 메모리 최적화 테이블을 포함하는 IMOLTP_DB 데이터베이스를 만듭니다. 이 명령을 실행하기 전에 path <driveAndPath> 가 있어야 합니다.

CREATE DATABASE IMOLTP_DB  
GO  
ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_fg CONTAINS MEMORY_OPTIMIZED_DATA  
ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_fg' , FILENAME = 'c:\data\IMOLTP_DB_fg') TO FILEGROUP IMOLTP_DB_fg;  
GO  

MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 최소값 결정

메모리 최적화 테이블에 대한 메모리 요구 사항을 결정하면 필요한 사용 가능한 메모리의 비율을 결정하고 메모리 비율을 해당 값 이상으로 설정해야 합니다.

예제:
이 예제에서는 계산에서 메모리 최적화 테이블 및 인덱스에 16GB의 메모리가 필요하다고 가정합니다. 사용하기 위해 커밋된 메모리가 32GB라고 가정합니다.

언뜻 보기에는 MIN_MEMORY_PERCENT 설정하고 MAX_MEMORY_PERCENT 50으로 설정해야 하는 것처럼 보일 수 있습니다(16은 32의 50%). 그러나 메모리 최적화 테이블에 충분한 메모리를 제공하지는 않습니다. 아래 표(메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율)를 살펴보면 커밋된 메모리가 32GB인 경우 메모리 최적화 테이블 및 인덱스에 80%만 사용할 수 있습니다. 따라서 커밋된 메모리가 아닌 사용 가능한 메모리를 기준으로 최소 및 최대 백분율을 계산합니다.

memoryNeedeed = 16
memoryCommitted = 32
availablePercent = 0.8
memoryAvailable = memoryCommitted * availablePercent
percentNeeded = memoryNeeded / memoryAvailable

실수에 연결:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625

따라서 메모리 최적화 테이블 및 인덱스의 16GB 요구 사항을 충족하려면 사용 가능한 메모리의 62.5% 이상이 필요합니다. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값은 정수여야 하므로 63% 이상으로 설정합니다.

리소스 풀 만들기 및 메모리 구성

메모리 최적화 테이블에 대한 메모리를 구성할 때 용량 계획은 MAX_MEMORY_PERCENT 아니라 MIN_MEMORY_PERCENT 기반으로 수행해야 합니다. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 대한 자세한 내용은 ALTER RESOURCE POOL(Transact-SQL)을 참조하세요. 이렇게 하면 메모리 최적화 테이블에 대해 예측 가능한 메모리 가용성을 제공합니다. MIN_MEMORY_PERCENT 다른 리소스 풀에 메모리 압력을 가하여 메모리가 유지되는지 확인합니다. 메모리를 사용할 수 있고 메모리 부족 조건을 방지하려면 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값이 동일해야 합니다. 커밋된 메모리의 양에 따라 메모리 최적화 테이블에 사용 가능한 메모리의 비율은 아래 메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율 을 참조하세요.

VM 환경에서 작업할 때 자세한 내용은 최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용 을 참조하세요.

다음 Transact-SQL 코드는 메모리의 절반을 사용할 수 있는 Pool_IMOLTP 리소스 풀을 만듭니다. 풀이 만들어진 후 Pool_IMOLTP를 포함하도록 리소스 관리자가 다시 구성됩니다.

-- set MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value  
CREATE RESOURCE POOL Pool_IMOLTP   
  WITH   
    ( MIN_MEMORY_PERCENT = 63,   
    MAX_MEMORY_PERCENT = 63 );  
GO  
  
ALTER RESOURCE GOVERNOR RECONFIGURE;  
GO  

풀에 데이터베이스 바인딩

시스템 함수 sp_xtp_bind_db_resource_pool 를 사용하여 데이터베이스를 리소스 풀에 바인딩합니다. 이 함수는 데이터베이스 이름과 리소스 풀 이름의 2개의 매개 변수를 사용합니다.

다음 Transact-SQL은 Pool_IMOLTP 리소스 풀에 대한 데이터베이스 IMOLTP_DB 바인딩을 정의합니다. 데이터베이스를 온라인 상태로 만들기 전에는 바인딩이 적용되지 않습니다.

EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'  
GO  

시스템 함수 sp_xtp_bind_db_resourece_pool은 database_name과 pool_name이라는 두 개의 문자열 매개 변수를 사용합니다.

바인딩 확인

IMOLTP_DB 대한 리소스 풀 ID를 표시하여 바인딩을 확인합니다. NULL이 아니어야 합니다.

SELECT d.database_id, d.name, d.resource_pool_id  
FROM sys.databases d  
GO  

바인딩 적용

바인딩을 적용하려면 데이터베이스를 리소스 풀에 바인딩한 후 오프라인으로 전환하고 다시 온라인 상태로 전환해야 합니다. 데이터베이스가 이전에 다른 풀에 바인딩된 경우 이전 리소스 풀에서 할당된 메모리를 제거하고 메모리 최적화 테이블 및 인덱스에 대한 메모리 할당은 이제 데이터베이스와 새로 바인딩된 리소스 풀에서 가져옵니다.

USE master  
GO  
  
ALTER DATABASE IMOLTP_DB SET OFFLINE  
GO  
ALTER DATABASE IMOLTP_DB SET ONLINE  
GO  
  
USE IMOLTP_DB  
GO  

이제 데이터베이스가 리소스 풀에 바인딩됩니다.

기존 풀에서 MIN_MEMORY_PERCENT 변경 및 MAX_MEMORY_PERCENT

서버에 메모리를 더 추가하거나 메모리 최적화 테이블 변경에 필요한 메모리 양을 추가하는 경우 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 변경해야 할 수 있습니다. 다음 단계에서는 리소스 풀에서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 변경하는 방법을 보여줍니다. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT에 사용할 값에 대한 지침은 아래 섹션을 참조하십시오. 자세한 내용은 VM 환경에서 메모리 내 OLTP 사용의 모범 사례 항목을 참조하세요.

  1. ALTER RESOURCE POOL 을 사용해서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 모두 변경합니다.

  2. ALTER RESOURCE GOVERNOR 를 사용하여 새 값으로 리소스 관리자를 다시 구성합니다.

예제 코드

ALTER RESOURCE POOL Pool_IMOLTP  
WITH  
     ( MIN_MEMORY_PERCENT = 70,  
       MAX_MEMORY_PERCENT = 70 )   
GO  
  
-- reconfigure the Resource Governor  
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율

메모리 최적화 테이블과 SQL Server 워크로드가 있는 데이터베이스를 동일한 리소스 풀에 매핑하는 경우 리소스 관리자는 풀의 사용자가 풀 사용과 충돌하지 않도록 메모리 내 OLTP 사용에 대한 내부 임계값을 설정합니다. 일반적으로 메모리 내 OLTP 사용에 대한 임계값은 풀의 약 80%입니다. 다음 표에서는 다양한 메모리 크기에 대한 실제 임계값을 보여 줍니다.

메모리 내 OLTP 데이터베이스에 대한 전용 리소스 풀을 만들 때 행 버전 및 데이터 증가를 고려한 후 메모리 내 테이블에 필요한 실제 메모리의 양을 예측해야 합니다. 필요한 메모리를 예측한 후에는 DMV sys.dm_os_sys_info의 'committed_target_kb' 열에 반영된 SQL 인스턴스에 대한 커밋 대상 메모리의 백분율로 리소스 풀을 만듭니다. 예를 들어 인스턴스에서 사용할 수 있는 총 메모리의 40%를 사용하여 리소스 풀 P1을 만들 수 있습니다. 이 40% 중 메모리 내 OLTP 엔진은 메모리 내 OLTP 데이터를 저장하는 데 더 작은 퍼센트를 가져옵니다. 이 작업은 메모리 내 OLTP가 이 풀의 모든 메모리를 사용하지 않도록 하기 위해 수행됩니다. 이 값이 더 작은 백분율은 대상 커밋된 메모리에 따라 달라집니다. 다음 표에서는 OOM 오류가 발생하기 전에 리소스 풀(이름 또는 기본값)의 메모리 내 OLTP 데이터베이스에 사용할 수 있는 메모리에 대해 설명합니다.

대상 커밋된 메모리 메모리 내 테이블에서 사용할 수 있는 비율
<= 8GB 70%
<= 16GB 75%
<= 32GB 80%
<= 96GB 85%
>96GB 90%

예를 들어 '대상 커밋된 메모리'가 100GB인 경우 메모리 최적화 테이블 및 인덱스에 60GB의 메모리가 필요하다고 예상한 다음, MAX_MEMORY_PERCENT = 67(60GB 필요/ 0.90 = 66.667GB - 최대 67GB, 67GB/100GB 설치 = 67%)을 사용하여 리소스 풀을 만들어 메모리 내 OLTP 개체에 필요한 60GB가 있는지 확인할 수 있습니다.

데이터베이스가 명명된 리소스 풀에 바인딩되면 다음 쿼리를 사용하여 여러 리소스 풀의 메모리 할당을 확인합니다.

SELECT pool_id  
     , Name  
     , min_memory_percent  
     , max_memory_percent  
     , max_memory_kb/1024 AS max_memory_mb  
     , used_memory_kb/1024 AS used_memory_mb   
     , target_memory_kb/1024 AS target_memory_mb  
   FROM sys.dm_resource_governor_resource_pools  

이 샘플 출력은 메모리 최적화 개체가 사용하는 메모리가 리소스 풀인 PoolIMOLTP에서 1356MB이고 상한이 2307MB임을 보여줍니다. 이 상한은 이 풀에 매핑된 사용자 및 시스템 메모리 최적화 개체에서 가져올 수 있는 총 메모리를 제어합니다.

샘플 출력
다음은 위에서 만든 데이터베이스 및 테이블의 결과입니다.

pool_id     Name        min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb  
----------- ----------- ------------------ ------------------ ------------- -------------- ----------------   
1           internal    0                  100                3845          125            3845  
2           default     0                  100                3845          32             3845  
259         Pool_IMOLTP 0                  100                3845          1356           2307  

자세한 내용은 sys.dm_resource_governor_resource_pools(Transact-SQL)를 참조 하세요.

명명된 리소스 풀에 데이터베이스를 바인딩하지 않으면 '기본' 풀에 바인딩됩니다. SQL Server에서 대부분의 다른 할당에 기본 리소스 풀을 사용하므로 DMV sys.dm_resource_governor_resource_pools 사용하여 메모리 최적화 테이블에서 사용하는 메모리를 관심 있는 데이터베이스에 대해 정확하게 모니터링할 수 없습니다.

참고 항목

sys.sp_xtp_bind_db_resource_pool(Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool(Transact-SQL)
리소스 관리자
리소스 관리자 리소스 풀
리소스 풀 만들기
리소스 풀 설정 변경
리소스 풀 삭제