sql server占用内存但完成后不会释放

时间:2014-11-26 09:14:25

标签: sql-server memory memory-leaks

在Sql Server Management Studio中,我运行一个复杂的SELECT语句,需要10分钟才能运行。它在我们的服务器中消耗10gb内存。问题是当SELECT语句完成时,它不会释放内存。我们可以将MAX SERVER MEMORY设置为某个内存,但我们想要的是它可以占用服务器中可用的所有内存,当它完成该过程时,它应该释放内存。

我认为这是内存泄漏,但我无法相信SQL SERVER中存在这样的问题。对此有解释吗?

3 个答案:

答案 0 :(得分:2)

当您查询SQL Server时,它会将数据页中的信息读入缓冲区缓存,以便后续读取可以直接进入内存并避免磁盘读取:这就是设计。要找出缓冲区缓存中的内容并确认这是您所看到的原因,您可以发出:

select
       count(*)as cached_pages_count,
       obj.name as objectname,
       ind.name as indexname,
       obj.index_id as indexid
from sys.dm_os_buffer_descriptors as bd
    inner join
    (
        select       object_id as objectid,
                           object_name(object_id) as name,
                           index_id,allocation_unit_id
        from sys.allocation_units as au
            inner join sys.partitions as p
                on au.container_id = p.hobt_id
                    and (au.type = 1 or au.type = 3)
        union all
        select       object_id as objectid,
                           object_name(object_id) as name,
                           index_id,allocation_unit_id
        from sys.allocation_units as au
            inner join sys.partitions as p
                on au.container_id = p.partition_id
                    and au.type = 2
    ) as obj
        on bd.allocation_unit_id = obj.allocation_unit_id
left outer join sys.indexes ind 
  on  obj.objectid = ind.object_id
 and  obj.index_id = ind.index_id
where bd.database_id = db_id()
  and bd.page_type in ('data_page', 'index_page')
group by obj.name, ind.name, obj.index_id
order by cached_pages_count desc

(取自这个答案:https://dba.stackexchange.com/a/43574/30216

答案 1 :(得分:1)

SQL服务器倾向于占用所有可用内存,直到配置的最大内存,然后只释放部分内存到自身。解决这个问题的唯一方法是#34;我发现的是将最大内存设置为我希望引擎使用的最大值。

答案 2 :(得分:1)

限制此操作的唯一方法是设置最大内存。 这不是内存泄漏。这是SQL Server的工作方式。 它使用内存进行缓存。

如果您认为SQL Server经常在专用服务器上运行,那就不错了。

我没有尝试过,但是甚至DBCC FREEPROCCACHE都不会释放你的记忆(这很危险)。