SQL Server在查询执行后不释放内存

时间:2013-06-25 06:59:20

标签: sql sql-server-2008 memory-management

我想我在这里有一个基本问题,许多人可能遇到过。当我在SQL Server中运行查询时,它将在内存中加载查询执行所需的所有数据(例如,如果存在连接,那么它将从这两个表中加载必要的数据)但是当查询完成执行内存时SQL Server消耗的内容未发布。

我注意到了这一点,因为几天前我正在分析占用大量tempdb空间的查询。当我以前运行查询时,它会(在执行结束时)消耗高达25 GB的RAM。除非我重新启动MSSQLSERVER服务,否则不会释放此25 GB RAM。

你们如何做SQL Server内存管理?这显然是个问题吗?

我还想听听你是否做了一些特定的事情来清除单个查询所用的内存。

提前致谢!

5 个答案:

答案 0 :(得分:27)

SQL Server确实设计为请求尽可能多的RAM,除非操作系统明确要求此内存,否则不会释放这些RAM。我认为最好的方法是限制服务器可以使用的RAM量,这将允许操作系统拥有一定数量的资源来使用无关紧要的东西。要设置此How to configure memory options using SQL Server Management Studio

  

使用两个服务器内存选项 min server memory max server memory ,重新配置SQL Server内存管理器管理的内存量(以MB为单位) SQL Server的一个实例。

     
      
  1. 在对象资源管理器中,右键单击服务器并选择属性
  2.   
  3. 点击内存节点。
  4.   
  5. 服务器内存选项下,输入最小服务器内存最大服务器内存所需的金额。
  6.   

您也可以使用以下命令在T-SQL中执行此操作(示例):

exec sp_configure 'max server memory', 1024
reconfigure

将消耗限制在1GB。

注意:以上内容不会将SQL Server的所有方面限制为该内存量。这仅控制缓冲池和执行计划缓存。诸如CLR,全文,SQL Server .exe文件使用的实际内存,SQL代理,扩展存储过程等不受此设置控制。然而,这些其他东西通常不需要那么多内存,它是需要大量内存的缓冲池和执行计划缓存。

我希望这会有所帮助。

答案 1 :(得分:6)

我也面临同样的问题。 但是在释放RAM内存时运行低于查询但在不到5小时内RAM内存就被占用了。所以我必须强行释放RAM内存。

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’2048'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO

然后运行以下:

2

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’6144'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO

答案 2 :(得分:4)

我认为没有办法强制SQL Server释放内存。 但是,您可以限制内存使用量。

sp_configure 'max server memory', <memory_size MB>
reconfigure

MSDN

答案 3 :(得分:1)

老问题,但我想我加两分钱。主要是使用dsql在缩小内存量后自动回滚到上一个值的上述答案中的内容。这很难看,但它确实有效。

IF OBJECT_ID(N'tempdb..##globaltemp') IS NOT NULL
BEGIN
    DROP TABLE ##globaltemp
END

SELECT TOP 1 value
INTO ##globaltemp
FROM sys.configurations
WHERE NAME LIKE '%server memory%'
ORDER BY NAME
OPTION (RECOMPILE);

EXEC sys.sp_configure N'max server memory (MB)'
    , N'1024'
GO

RECONFIGURE
WITH OVERRIDE
GO

DECLARE @dsql AS VARCHAR(20)

SELECT @dsql = cast(value AS NVARCHAR(20))
FROM ##globaltemp

EXEC sys.sp_configure N'max server memory (MB)'
    , @dsql
GO

RECONFIGURE
WITH OVERRIDE
GO

答案 4 :(得分:-1)

SQL是一种高级声明性语言。它不是为了让您能够像在C等较低级别的编程语言中编写代码那样参与内存管理等细节。我想您会发现如果它需要释放内存对于另一项任务,它会很快让它离开。