SQL Server 2005:没有足够的系统内存来运行此查询

我们的一个SQL服务器,运行稳定一段时间(几年),最近一直在抛出不足的内存错误。 从应用程序事件日志中,我们看到:

事件ID:701

说明:没有足够的系统内存来运行此查询。

我们pipe理这个服务器的团队主要由开发人员组成,这些开发人员在系统pipe理职责上倍增。 但是,我们的主要专长是发展。 这就是说,我们对如何解决这个问题感到茫然。 我们一直在search论坛,什么也没有find任何匹配的东西

所以,这里有一些更多的细节来帮助解决问题:

  • 我们的最servlets器内存设置为0。
  • 我们的最大服务器内存设置为2000。
  • 总物理内存为3,325.85 MB(来自sysinfo)。
  • 总虚拟内存为7.10 GB(来自sysinfo)。
  • 我们没有使用AWE来分配内存,但现在我们来看看它是否有所作为。
  • 此错误是由备份事务日志的作业引发的,未运行查询。
  • 我们有很多链接的服务器。 另一方面,RDBMS的types是SQL Server(2005和2000),Oracle 10g和OSI PI系统。
  • 这是间歇性的。 我们似乎无法将任何时间或事件与错误关联起来。
  • 当然,重新启动似乎会让它消失一段时间,由于错误信息的性质,这是有意义的。
  • 此服务器作为应用程序服务器(几个Windows服务)和Web服务器以及数据库服务器组成三元组。

编辑:

我们在SP3上。 我们发现的大部分post都是SP1以前的版本,不适用于我们。

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') 

回报

9.00.4035.00 SP3标准版

我会build议使用-g启动参数。 它似乎适用于大多数人,也可能会为你工作。 我唯一担心的是,潜在的问题可能无法解决。 例如,如果由于链接的服务器而导致内存泄漏,并且MTL增加到512Mb,那么这只是内存问题之间的较长时期? 我不知道答案是什么,但我倾向于同意UndertheFold,因为一个perfmon可能是一个好的开始。

错误消息“没有足够的系统内存来运行此查询。” 指虚拟地址空间(VAS)不可用,而不是传统意义上的内存,即在SQL Server进程空间内。

假设你只在这个服务器上运行3GB,并且SQL Server已经被分配到了2GB,这意味着操作系统,更重要的是,其他任何东西都不到1GB。 这不是一个很大的记忆。

如果这个问题确实是内存泄漏的结果,那么它就是正在使用的SQL Server进程空间(memToLeave)之外的VAS。

我会build议使用-g启动参数将更多的内存分配给memToLeave部分。

请参阅以下文章以获取更多信息:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

您也可能希望减lessSQL Server的最大内存设置,但我会做这最后的手段。

这可能与链接服务器驱动程序的内存泄漏有关, 根据此论坛主题 :

以下是微软告诉我们的。

显然,使用链接的服务器处理数据,特别是狐狸pro驱动程序导致随着时间的推移内存泄漏。

此服务器作为应用程序服务器(几个Windows服务)和Web服务器以及数据库服务器组成三元组。

我会设置你的最小内存 – 这些其他进程很可能是从SQL中“窃取”内存

你可以使用perfmon来运行一个计数器logging来确认这个和/或给自己更多的信息来确定真正的问题是什么。

从这个博客引用!

解决这个问题有不同的select。

首先,检查你的SQL Server设置“最servlets器内存”和“最大服务器内存”。 如果发现这两个值的差别非常小,则增加“最大服务器内存”。

其次,用它的内存使用信息发现长时间运行的查询,如果这个查询处于空闲状态,请validation并终止这个过程。 数据库性能优化对于内存使用来说是一件重要的事情。

第三,发现长时间运行的查询的索引用法,因为没有适当的索引你的系统磁盘I / O增加,直接影响你的记忆。

四,检查虚拟内存页面文件的大小,增加这个文件的大小。

第五,检查“每查询最小内存”的大小实际上它是默认的1024 KB,但在极less数情况下,可以减小此参数的大小。 事实上,这是不可取的,但你可以尝试。

第六,尝试执行这个DBCC命令,这是不可取的,因为它可能会影响服务器的整体性能。 但是你可以试试这个。