sql - 执行查询后,SQL Server不释放内存

标签 sql sql-server-2008 memory-management

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

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

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

我还想听听您是否进行了一些特定的操作来清除单个查询所用的内存。

提前致谢!

最佳答案

实际上,SQL Server设计为请求尽可能多的RAM,除非操作系统明确要求此内存,否则不会释放该RAM。我认为最好的方法是限制服务器可以使用的RAM数量,这将使OS拥有一定数量的资源以使用no-matter-what。设置这个How to configure memory options using SQL Server Management Studio:

Use the two server memory options, min server memory and max server memory, to reconfigure the amount of memory (in megabytes) managed by the SQL Server Memory Manager for an instance of SQL Server.

  1. In Object Explorer, right-click a server and select Properties.
  2. Click the Memory node.
  3. Under Server Memory Options, enter the amount that you want for Minimum server memory and Maximum server memory.


您也可以使用以下命令(示例)在T-SQL中执行此操作:
exec sp_configure 'max server memory', 1024
reconfigure

将消耗限制为1GB。

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

我希望这有帮助。

关于sql - 执行查询后,SQL Server不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17291047/

相关文章:

android - 将大量图像加载到钛 ImageView 中

sql - 使用 IIF 和 SIMILAR TO 在 INSERT 中将 char 转换为整数

sql - T-SQL 从列中获取文件扩展名

sql-server-2008 - 如何根据特定条件从所有表中获取行数

iPhone内存管理

linux - 从 Linux 内核模块识别 glibc mmap 区域(VMA)

sql - 从sql server中的字符串末尾提取子字符串

php - SELECT DISTINCT 还是单独的规范化表?

c# - SQL-Server-2008:XML 问题

sql-server - 更新触发器和批量更新后