内存优化表内存分配问题

Ehs*_* HP 4 sql-server sql-server-2016

我在 SQL Server 中有一些内存中 OLTP 对象,它的版本是 SQL Server 2016 SP2-CU4。由于某些表的数据行大小大于 8060 字节,我遇到了问题,因此内部 xtp DMV 中有一些行外存储,这些表分配了大约 120GB 的内存。

我改变这些表并将行大小减少到小于 8060 字节,分配给这些表的内存减少,分配给 object_id=0 的内存在 sys.dm_db_xtp_table_memory_stats 中增长,大约 50GB。我认为垃圾收集器线程无法找到这个孤立对象,因此它无法释放内存。

另一个问题是“分配给内存优化对象的内存”为 25GB,其中“内存优化对象使用的内存”为 62GB,可能我认为这是一个错误

我怎么能释放这个内存?!

在此处输入图片说明

在此处输入图片说明

Jos*_*ell 5

您应该查看内存 OLTP 之王 Ned Otter 的这篇博文:

内存中 OLTP 的行版本生命周期

特别是,这段话:

2. 从内存中释放行

...

所以垃圾收集的两个触发器是内存压力和/或事务活动。相反,这意味着如果没有内存压力 - 或者事务活动很低 - 拥有不被垃圾收集的行版本是完全合理的。也没有办法强制进行垃圾收集。

所以这只是为了澄清有些情况可能不会发生垃圾收集,或者可能会发生缓慢。

这篇文章继续讨论在内存表上长时间运行的查询将完全阻止垃圾收集,所以一定要检查其中的任何一个。


SSMS 的屏幕截图关闭的原因(使用它高于分配)是因为它纯粹基于 DMV,因此NULLmemory_allocated_for_table_kb 忽略了计算。这是打开数据库属性窗口时运行的内容:

SELECT
    isnull((
        select convert(decimal(18,2),(sum(tms.memory_allocated_for_table_kb) + sum(tms.memory_allocated_for_indexes_kb)))
        from [sys].[dm_db_xtp_table_memory_stats] tms)
    , 0.00) AS [MemoryAllocatedToMemoryOptimizedObjectsInKB]

SELECT
    isnull((
        select convert(decimal(18,2),(sum(tms.memory_used_by_table_kb) + sum(tms.memory_used_by_indexes_kb)))
        from [sys].[dm_db_xtp_table_memory_stats] tms)
    , 0.00) AS [MemoryUsedByMemoryOptimizedObjectsInKB]
Run Code Online (Sandbox Code Playgroud)

我仍然不确定该object_id = 0行的目的是什么dm_db_xtp_table_memory_stats。我可以在本地重复该行为(创建一个包含 LOB 数据的表,然后更改列以​​适应行,突然我得到相同的 0 结果),但我不知道这是否有问题。

这可能是与内存中 OLTP 相关的正常开销,但这可能是一个错误。如果它造成重大问题,我建议向 Microsoft 开一个案例。之前有与 LOB 数据的内存使用相关的错误,请参阅MSDN 论坛 | 以内存中 OLTP为例,以及此 CU:修复:当您运行查询以通过 SQL Server 2016 中的内存中 OLTP 访问 LOB 列时出现内存不足错误