我在Server中有一些内存中的OLTP对象,它的版本是SQLServer2016SP2-CU4。我遇到了一个问题,因为某些表的数据行大小大于8060字节,所以在内部xtp中有一些行外存储,这些表分配了一个大约120 of的内存。
我修改该表并将行大小减小到8060字节以下,分配给这些表的内存减少,分配给object_id=0的内存在sys.dm_db_xtp_table_memory_stats中增长,大约为50 it。我认为垃圾收集器线程找不到这个孤立的对象,因此它无法释放内存。
另一个问题是“分配给内存优化对象的内存”为25 be,其中“内存优化对象使用的内存”为62 be,可能是我认为这是一个bug。
我怎么才能释放这个记忆?!
发布于 2018-12-20 12:22:01
您应该查看内存中的OLTP之王Ned Otter的这篇博客文章:
内存中OLTP的行版本生命周期
特别是,这一段:
因此,这只是为了澄清在某些情况下垃圾收集可能不会发生,或者可能会缓慢发生。
文章接着讨论了内存表上长期运行的查询将完全阻止垃圾收集,因此请确保检查其中的任何一个。
SSMS的屏幕截图被关闭(使用它高于分配)是因为它完全基于DMV,因此NULL
memory_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]
我仍然不确定object_id = 0
行在dm_db_xtp_table_memory_stats
中的用途是什么。我可以在本地重复这种行为(用LOB数据创建一个表,然后修改列以适应行,突然间我得到了相同的0结果),但我不知道这是否有问题。
这可能是与内存中OLTP相关的正常开销,但可能是一个bug。如果它造成了重大问题,我建议与微软展开一个案例。以前有一些与LOB数据的内存使用有关的bug,参见内存OLTP中的MSDN论坛中的一个例子,以及这个CU:修复:在Server 2016中运行通过内存中OLTP访问LOB列的查询时出现内存不足错误。。
https://dba.stackexchange.com/questions/225447
复制相似问题