执行大型批处理时,SQL Server报告 701“内存不足,无法运行此查询”
摘要: 错误消息中会自动记录错误日志的输出,存储请求的内存量包含依赖于可能将请求低效地保存到内存中的条目。在这种方式下,服务器在运行前将整个请求存储在内存中。)因此,该缓存中的分配过多,可能导致所有可用内存耗尽。释放服务器端关联对象的内存。
本文内容
本文讨论在 SQL 中执行大量操作时可能发生的 701 错误。 有关 701 错误的其他原因,请参阅 。
原始产品版本:SQL
原始 KB 编号:
症状
在 SQL 中,执行大量远程过程调用 (RPC) (例如,在单个批处理) 中插入数万次时,操作可能会失败,并SQL 错误日志中报告以下错误:
2020-07-04 13:30:45.78 spid56 Error: 701, Severity: 17, State: 193.
2020-07-04 13:30:45.78 spid56 There is insufficient system memory to run this query.
如果查看 DBCC 在 701 错误消息上自动记录到错误日志的输出,它将包含如下所示的条目:
2020-07-04 13:30:45.74 spid56 Failed allocate pages: FAIL_PAGE_ALLOCATION 1
2020-07-04 13:30:45.76 spid58
Memory Manager
VM Reserved = 1657936 KB
VM Committed = 66072 KB
AWE Allocated = 2351104 KB ==> ~2.2 GB
Reserved Memory = 1024 KB
Reserved Memory In Use = 0 KB
2020-07-04 13:30:45.76 spid56
USERSTORE_SXC (Total)
VM Reserved = 0 KB
VM Committed = 0 KB
AWE Allocated = 0 KB
SM Reserved = 0 KB
SM Committed = 0 KB
SinglePage Allocator = 1127848 KB ==> ~1.07 GB
MultiPage Allocator = 0 KB
2020-07-04 13:30:45.78 spid56 Error: 701, Severity: 17, State: 193.
2020-07-04 13:30:45.78 spid56 There is insufficient system memory to run this query.
注意
请注意缓存 的较大分配。
此外,如果在执行批处理时查询 sys. 动态管理视图 (DMV) , 则缓存的 列在导致 701 错误的时间段内显示持续增长。
有关可能表现出此行为的应用程序的示例,请参阅 。
原因
分配用于在 SQL 中存储请求的内存量取决于:
例如,对于某些类型的参数 ((例如) ),SQL 可能会以可能低效的方式将请求保存在内存中。 当客户端发送使用这些类型参数的大量请求时,可以在一个请求中发送多个 RPC。 在此方案中,服务器在执行之前将整个请求累积到内存中。 这可能会导致 中讨论的 701 错误。
此问题在较旧版本的SQL (中更为普遍,尤其是在使用数据类型) 时。 SQL 2008 及更高版本具有一些设计增强功能,可减少在某些情况下使用的内存量,并且整体效率更高。
解决方案
若要解决此错误,请使用以下方法之一:
缓存 用于连接管理级别分配,例如 RPC 参数以及与已准备句柄关联的内存。 当客户端发送包含大量 RPC 调用的请求时,每个调用都可能使用大量特定类型的参数(例如 ),这可能会导致此缓存中的分配过多,从而耗尽所有可用内存。
还应监视应用程序,以确保我们及时关闭准备好的句柄。 如果不及时关闭这些句柄,将阻止SQL 释放服务器端关联对象的内存。
我来说两句