在Sql Server Management Studio中,我运行一个复杂的SELECT语句,需要10分钟才能运行。它在我们的服务器中消耗10gb内存。问题是当SELECT语句完成时,它不会释放内存。我们可以将MAX SERVER MEMORY设置为某个内存,但我们想要的是它可以占用服务器中可用的所有内存,当它完成该过程时,它应该释放内存。
我认为这是内存泄漏,但我无法相信SQL SERVER中存在这样的问题。对此有解释吗?
答案 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
答案 1 :(得分:1)
SQL服务器倾向于占用所有可用内存,直到配置的最大内存,然后只释放部分内存到自身。解决这个问题的唯一方法是#34;我发现的是将最大内存设置为我希望引擎使用的最大值。
答案 2 :(得分:1)
限制此操作的唯一方法是设置最大内存。 这不是内存泄漏。这是SQL Server的工作方式。 它使用内存进行缓存。
如果您认为SQL Server经常在专用服务器上运行,那就不错了。
我没有尝试过,但是甚至DBCC FREEPROCCACHE都不会释放你的记忆(这很危险)。