【发布时间】:2013-06-21 21:05:48
【问题描述】:
我想我有一个很多人可能遇到过的基本问题。当我在 SQL Server 中运行查询时,它将在内存中加载执行查询所需的所有数据(例如,如果存在连接,则它将从这两个表中加载必要的数据),但是当查询完成执行内存时SQL Server 使用的未释放。
我注意到这一点是因为几天前我正在分析一个占用大量 tempdb 空间的查询。当我过去运行查询时,它会(在执行结束时)消耗多达 25 GB 的 RAM。除非我重新启动 MSSQLSERVER 服务,否则不会释放这 25 GB RAM。
你们是如何进行 SQL Server 内存管理的?这显然是个问题吧?
我也想知道你是否做了一些特定的事情来清除单个查询所用的内存。
提前致谢!
【问题讨论】:
-
你用的是什么版本?这是 SQL Server 2008 R2 之前的已知问题。我不确定 2012 年。我会尽快提供答案...
-
"这显然是个问题吧?" - 不。这不是 Killercam 所说的“问题”。 SQL Server 设计是为了抢占内存并保持它,除非操作系统发出它运行不足的信号。从长远来看,哪个更好 - SQL Server 处理每个查询,产生将数据加载到内存中的任何/所有 I/O 成本,但随后巧妙地将所有这些数据再次抛出,或者它一直在徘徊以防将来的查询将从已经加载的数据中受益?
-
同意。但在许多情况下,我确定不会再次使用该查询。我希望在这种情况下释放内存。感谢您的回复。
-
重点是,这就是服务器设计要做的事情。当它需要更多内存时,它会从操作系统中获取内存,然后 它 开始管理该内存,决定在其中放入什么等。除非操作系统发出低内存信号,否则它不会归还内存。
-
绝对同意。但是,如果我确实想以编程方式释放内存该怎么办?
标签: sql sql-server-2008 memory-management