资源池表示可以管理的物理资源的子集。 默认情况下,SQL Server 数据库绑定到默认资源池并使用资源池的资源。 若要保护 SQL Server 使其资源由一个或多个内存优化表使用,并防止其他内存用户消耗内存优化表所需的内存,应创建单独的资源池来管理具有内存优化表的数据库的内存消耗。
数据库只能绑定到一个资源池。 但是,可以将多个数据库绑定到同一池。 SQL Server 允许将没有内存优化表的数据库绑定到资源池,但它不起作用。 如果将来可能需要在数据库中创建内存优化表,则可能需要将数据库绑定到命名资源池。
必须先存在数据库和资源池,然后才能将数据库绑定到资源池。 该绑定在下次数据库联机时生效。 有关详细信息,请参阅 数据库状态 。
有关资源池的信息,请参阅 资源调控器资源池。
创建数据库和资源池
可以按任意顺序创建数据库和资源池。 重要的是,在将数据库绑定到资源池之前,它们都存在。
创建数据库
以下 Transact-SQL 创建一个名为IMOLTP_DB的数据库,其中包含一个或多个内存优化表。 运行此命令之前,路径 <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的最小值
确定内存优化表的内存需求后,需要确定所需的可用内存百分比,并将内存百分比设置为该值或更高版本。
示例:
对于此示例,我们将假设在计算中确定内存优化表和索引需要 16 GB 内存。 假设已分配32 GB的内存专供你使用。
乍一看,似乎你需要将 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 设置为 50,因为 16 是 32 的 50%。 但是,这不会为内存优化表提供足够的内存。 查看下表(内存优化表和索引可用的内存百分比),我们看到,如果有 32 GB 的已提交内存,则只有 80 个% 可用于内存优化表和索引。 因此,我们根据可用内存(而不是已提交的内存)计算最小和最大百分比。
memoryNeedeed = 16
memoryCommitted = 32
availablePercent = 0.8
memoryAvailable = memoryCommitted * availablePercent
percentNeeded = memoryNeeded / memoryAvailable
插入实数:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625
因此,您需要至少 62.5% 的可用内存,以满足您的内存优化表和索引的 16 GB 要求。 由于MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT的值必须是整数,因此我们将它们设置为至少 63%。
创建资源池并配置内存
为内存优化表配置内存时,应基于MIN_MEMORY_PERCENT而不是MAX_MEMORY_PERCENT完成容量规划。 有关MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT的信息,请参阅 ALTER RESOURCE POOL (Transact-SQL )。 这为内存优化表提供了更可预测的内存可用性,因为MIN_MEMORY_PERCENT会导致其他资源池产生内存压力,以确保其被遵守。 为了确保内存可用并帮助避免内存不足的情况,MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT的值应相同。 请参阅以下 内存优化表和索引的可用内存百分比 ,以了解基于已提交内存量可用于内存优化表的内存百分比。
请参阅 最佳做法:在 VM 环境中使用 In-Memory OLTP ,了解在 VM 环境中工作时的详细信息。
以下 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 将数据库绑定到资源池。 该函数采用两个参数:数据库名称和资源池名称。
以下 Transact-SQL 定义数据库IMOLTP_DB到资源池Pool_IMOLTP的绑定。 只有在使数据库联机之后,绑定才会生效。
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的值的指导,请参阅以下部分。 有关详细信息,请参阅主题 最佳做法:在 VM 环境中使用 In-Memory OLTP 。
使用
ALTER RESOURCE POOL更改 MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT 的值。使用
ALTER RESURCE 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 工作负荷的数据库映射到同一资源池,资源调控器会设置 In-Memory OLTP 使用的内部阈值,以便池用户不会与池使用情况发生冲突。 一般来说,In-Memory OLTP 使用的阈值大约为池的 80%。 下表显示了各种内存大小的实际阈值。
为 In-Memory OLTP 数据库创建专用资源池时,需要在考虑行版本和数据增长后估计内存中表所需的物理内存量。 估计所需的内存后,可以以 SQL 实例的提交目标内存的百分比来创建资源池,这反映在 DMV sys.dm_os_sys_info 中的“committed_target_kb”列(请参阅 sys.dm_os_sys_info)。 例如,可以创建资源池 P1,其中包含实例可用的总内存的 40%。 在这 40 个%中,In-Memory OLTP 引擎获得较小的百分比来存储 In-Memory OLTP 数据。 这样做是为了确保 In-Memory OLTP 不会消耗此池中的所有内存。 此较小比例的具体值依赖于目标提交的内存量。 下表描述了在引发 OOM 错误之前,资源池(命名或默认)中可用于 In-Memory OLTP 数据库的内存。
| 目标提交内存 | 用于内存表的可用百分比 |
|---|---|
| <= 8 GB | 70% |
| <= 16 GB | 75% |
| <= 32 GB | 80% |
| <= 96 GB | 85% |
| >96 GB | 90% |
例如,如果“目标提交的内存”为 100 GB,并预计内存优化的表和索引需要 60GB 内存,那么您可以创建一个资源池,其中 MAX_MEMORY_PERCENT = 67 (需要的 60GB / 0.90 = 66.667GB,向上舍入为 67GB;已安装为 67GB / 100GB = 67%),以确保您的 In-Memory 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 中,内存优化对象使用的内存为 1356 MB,上限为 2307 MB。 控制映射到此池的用户和系统内存优化对象可以使用的总的可用内存的上限。
示例输出
此输出来自上面创建的数据库和表。
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 PoolIMOLTP 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)
资源调控器
资源调控器资源池
创建资源池
更改资源池设置
删除资源池