我在用着
Microsoft SQL Server Enterprise:基于内核的许可(64 位)版本 12.0.4100.1
我有一个代码,它创建了许多非持久内存优化表,将它们用于某些事情,并在不再需要它们时删除它们。
但是,似乎删除的表仍在消耗 RAM,因为如果我运行
SELECT pool_id, Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS max_memory_mb,
used_memory_kb/1024 AS used_memory_mb, target_memory_kb/1024 AS target_memory_mb
FROM sys.dm_resource_governor_resource_pools
WHERE Name='InMemoryObjects'
我得到以下信息:
pool_id Name min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb
256 InMemoryObjects 50 50 380003 233239 380003
请注意“used_memory_mb”列的高度。在我运行此程序时,服务器中没有内存优化表,所以我认为它必须是来自已删除内存优化表的数据,但仍以某种方式占用 RAM。
同样,当我跑步时
SELECT type, name, memory_node_id, pages_kb/1024 AS pages_MB
FROM sys.dm_os_memory_clerks WHERE type LIKE '%xtp%'
我得到以下输出:
type name memory_node_id pages_MB
MEMORYCLERK_XTP Default 0 1055
MEMORYCLERK_XTP DB_ID_19 0 6
MEMORYCLERK_XTP DB_ID_33 0 6
MEMORYCLERK_XTP DB_ID_41 0 56
MEMORYCLERK_XTP DB_ID_47 0 0
MEMORYCLERK_XTP DB_ID_32 0 233240
MEMORYCLERK_XTP Default 1 0
MEMORYCLERK_XTP Default 64 0
看看 DB_ID_32 是如何占用相同的 ~240gb 内存的?
我需要一些方法来清除它。当我运行多个代码实例时,我收到错误“资源池 'InMemoryObjects' 中的系统内存不足,无法运行此查询”。所以我认为这个内存实际上必须被捆绑起来,并且当它充满时不会释放自己。资源池“InMemoryObjects”仅针对这一代码创建,除了该代码创建(并随后丢弃)的对象之外,整个服务器中没有其他内存优化对象。它创建的内存优化表都相当小(每张几 GB)。
我知道垃圾收集器应该每分钟运行一次,但是自从数据库中存在任何内存优化表以来已经过去了一天,并且使用的内存根本没有减少。我尝试过强制垃圾收集、检查点、重置统计信息等,但无法取回这些内存。
我发现唯一可行的方法是将整个数据库脱机并重新联机。但是我真的不能每次运行代码时都这样做,所以我需要一个更好的解决方案。
任何想法将不胜感激。谢谢!