den*_*ola 5 sql-server memory-optimized-tables sql-server-2016
我正在尝试放置一个内存中 OLTP 表,
这是您需要的内存估计:
但当迁移开始时,会显示以下错误消息:
我的表大小约为22GB
我有一台 64GB 内存的服务器,我为 SQL 分配了 56GB,为了将表放入内存,我只需要 23GB
有谁能够帮助我?谢谢。
您是否将数据库绑定到特定的资源池?
尝试增加池的可用内存。
将具有内存优化表的数据库绑定到资源池 - 可用于内存优化表和索引的内存百分比
如果将具有内存优化表的数据库和 SQL Server 工作负载映射到同一资源池,则资源调控器会设置内存中 OLTP 使用的内部阈值,以便池的用户不会在池使用方面发生冲突。一般来说,内存 OLTP 使用的阈值约为池的 80%。下表显示了各种内存大小的实际阈值。
当您为内存OLTP数据库创建专用资源池时,您需要在考虑行版本和数据增长后估计内存表需要多少物理内存。一旦估计了所需的内存,您就可以使用 SQL 实例的提交目标内存的百分比创建一个资源池,如 DMV sys.dm_os_sys_info 中的“comfilled_target_kb”列所反映。例如,您可以创建资源池 P1,其中实例可用总内存的 40%。在这 40% 中,内存 OLTP 引擎获得较小的百分比来存储内存 OLTP 数据。这样做是为了确保内存中 OLTP 不会消耗该池中的所有内存。这个较小百分比的值取决于目标提交的内存。下表描述了在引发 OOM 错误之前资源池(指定或默认)中内存 OLTP 数据库可用的内存。
使用此查询对其进行评估
USE master
GO
;WITH cte
AS ( SELECT RP.pool_id ,
RP.Name ,
RP.min_memory_percent ,
RP.max_memory_percent ,
CAST (RP.max_memory_kb / 1024. / 1024.
AS NUMERIC(12, 2)) AS max_memory_gb ,
CAST (RP.used_memory_kb / 1024. / 1024.
AS NUMERIC(12, 2)) AS used_memory_gb ,
CAST (RP.target_memory_kb / 1024. / 1024.
AS NUMERIC(12,2)) AS target_memory_gb,
CAST (SI.committed_target_kb / 1024. / 1024.
AS NUMERIC(12, 2)) AS committed_target_kb
FROM sys.dm_resource_governor_resource_pools RP
CROSS JOIN sys.dm_os_sys_info SI
)
SELECT c.pool_id ,
c.Name ,
c.min_memory_percent ,
c.max_memory_percent ,
c.max_memory_gb ,
c.used_memory_gb ,
c.target_memory_gb ,
CAST(c.committed_target_kb *
CASE WHEN c.committed_target_kb <= 8 THEN 0.7
WHEN c.committed_target_kb < 16 THEN 0.75
WHEN c.committed_target_kb < 32 THEN 0.8
WHEN c.committed_target_kb <= 96 THEN 0.85
WHEN c.committed_target_kb > 96 THEN 0.9
END * c.max_memory_percent /100 AS NUMERIC(12,2))
AS [Max_for_InMemory_Objects_gb]
FROM cte c
Run Code Online (Sandbox Code Playgroud)