34

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

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

你们如何进行 SQL Server 内存管理?这显然是个问题吧?

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

提前致谢!

4

5 回答 5

29

SQL Server 确实旨在请求尽可能多的 RAM,除非操作系统明确需要此内存,否则这些 RAM 不会被释放。我认为最好的方法是限制服务器可以使用的 RAM 数量,这将允许操作系统拥有一定数量的资源来使用任何东西。要设置此如何使用 SQL Server Management Studio 配置内存选项

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

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

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

exec sp_configure 'max server memory', 1024
reconfigure

将消耗限制为 1GB。

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

我希望这有帮助。

于 2013-06-25T07:30:54.840 回答
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
于 2014-05-28T06:20:01.273 回答
4

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

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

MSDN

于 2013-06-25T07:25:51.097 回答
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
于 2016-04-18T15:32:07.323 回答
-2

SQL 是一种高级声明性语言。它的目的不是让您像使用 C 等较低级别的编程语言编写代码那样参与诸如内存管理之类的细节。我想您会发现,如果它需要释放内存对于另一项任务,它会很快放手。

于 2013-06-25T07:23:56.643 回答