首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存优化表内存分配问题

内存优化表内存分配问题
EN

Database Administration用户
提问于 2018-12-20 09:09:41
回答 1查看 1.2K关注 0票数 4

我在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。

我怎么才能释放这个记忆?!

EN

回答 1

Database Administration用户

发布于 2018-12-20 12:22:01

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

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

特别是,这一段:

  1. 从内存中删除行..。因此,垃圾收集的两个触发器是内存压力和/或事务活动。相反,这意味着如果没有内存压力--或者事务活动很低--那么没有垃圾收集的行版本是完全合理的。也没有办法强制垃圾收集发生。

因此,这只是为了澄清在某些情况下垃圾收集可能不会发生,或者可能会缓慢发生。

文章接着讨论了内存表上长期运行的查询将完全阻止垃圾收集,因此请确保检查其中的任何一个。

SSMS的屏幕截图被关闭(使用它高于分配)是因为它完全基于DMV,因此NULL memory_allocated_for_table_kb抛出了计算。这就是打开数据库属性窗口时运行的内容:

代码语言:javascript
运行
复制
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列的查询时出现内存不足错误。

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/225447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档