内存中 OLTP SQL Server 2016 - 系统内存不足

den*_*ola 5 sql-server memory-optimized-tables sql-server-2016

我正在尝试放置一个内存中 OLTP 表,

这是您需要的内存估计:

在此输入图像描述在此输入图像描述

但当迁移开始时,会显示以下错误消息:

在此输入图像描述

我的表大小约为22GB

在此输入图像描述

我有一台 64GB 内存的服务器,我为 SQL 分配了 56GB,为了将表放入内存,我只需要 23GB

在此输入图像描述

在此输入图像描述

在此输入图像描述

有谁能够帮助我?谢谢。

MBu*_*chi 1

您是否将数据库绑定到特定的资源池?

尝试增加池的可用内存。

将具有内存优化表的数据库绑定到资源池 - 可用于内存优化表和索引的内存百分比

如果将具有内存优化表的数据库和 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)