我想我在这里有一个基本问题,许多人可能遇到过。当我在SQL Server中运行查询时,它将在内存中加载查询执行所需的所有数据(例如,如果存在连接,那么它将从这两个表中加载必要的数据)但是当查询完成执行内存时SQL Server消耗的内容未发布。
我注意到了这一点,因为几天前我正在分析占用大量tempdb
空间的查询。当我以前运行查询时,它会(在执行结束时)消耗高达25 GB的RAM。除非我重新启动MSSQLSERVER
服务,否则不会释放此25 GB RAM。
你们如何做SQL Server内存管理?这显然是个问题吗?
我还想听听你是否做了一些特定的事情来清除单个查询所用的内存。
提前致谢!
答案 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的一个实例。
- 在对象资源管理器中,右键单击服务器并选择属性。
- 点击内存节点。
- 在服务器内存选项下,输入最小服务器内存和最大服务器内存所需的金额。
醇>
您也可以使用以下命令在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
答案 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等较低级别的编程语言中编写代码那样参与内存管理等细节。我想您会发现如果它需要释放内存对于另一项任务,它会很快让它离开。