SQL 2008执行语句遇到内存不足的案例(error 701)之一

本文详细分析了SQL Server 2008执行存储过程时遇到内存不足(Error 701)的问题。问题出现在即使在单一用户环境下,该存储过程也会在执行一分钟左右后报错。经过测试发现,存储过程的编译和执行计划无误,但执行时内存不足。收集Windows性能监视器日志和SQL Server动态性能视图信息后,发现内存分配过大导致问题。解决方案是降低存储过程的最大并行度,避免内存过度分配。
摘要由CSDN通过智能技术生成

某个特定的存储过程在SQL 2008中执行会遇到以下错误:
Msg 701, Level 17, State 123, Procedure GetAllRevisions_Monthly, Line 22
There is insufficient system memory in resource pool 'internal' to run this query.
Msg 701, Level 17, State 65, Procedure GetAllRevisions_Monthly, Line 22
There is insufficient system memory in resource pool 'internal' to run this query.

  

我们可以从问题的描述和现象中得到什么信息:

首先我们需要确认几个问题:

<!--[if !supportLists]-->1.     <!--[endif]-->这个存储过程在单独执行的时候会不会遇到这个错误。也就是说,在一个没有其他用户访问的时候,单独执行这个存储过程。这一点非常重要,可以帮助我们确认SQL Server是由于总体的工作负载太高而导致无法分配足够内存执行语句,还是这条语句本身执行的问题。

<!--[if !supportLists]-->2.     <!--[endif]-->这个存储过程是不是每次执行都会遇到这个错误。

在这个案例中的情形,该存储过程即使在单一用户访问的时候执行,也会遇到这样的错误,并且在每次执行的时候都会出现同样的错。需要注意的是,这个存储过程在第一次执行的时候,会执行一分钟左右以后,报出错误信息。而当第二次执行和以后多次执行的时候,都是不到一秒立即报错。

这里额外的介绍一下对于语句和存储过程,多次测试的时候需要注意的问题:任何语句在第一次执行的时候,会生成执行计划并且将执行计划缓存的SQL Server的内存中,而第二次或者以后多次执行,只要之前存放的执行计划没有从内存中清除,语句和存储过程是会重用原有存储的执行计划。因此,如果我们希望每次测试都能实现语句第一次执行时候的效果,我们需要每次执行之前将缓存的执行计划手工清除。DBCC freeprocache这个命令可以帮助我们清除所有缓存的执行计划。

这个案例的测试情况如下:

Dbcc freeproccache

执行存储过程,用时一分钟,报错。

再次执行存储过程,立刻返回错误。

Dbcc freeproccahe

执行存储过程,用时一分钟,报错。

再次执行存储过程,立刻返回错误。

通过这个现象,可以得出结论,首次执行一分钟以后报错,是因为对该存储过程进行了编译和生成执行计划。而后续执行时立即报错,是重用了存储过程缓存的执行计划。也就是说,这个存储过程的解析和编译过程是没有问题的。但是一旦按照编译的执行计划执行的时候,就遇到了内存不足的问题。

以上是我们通过问题的现象和描述分析出问题的可能性。接下来我们就进入重现问题收集log的阶段。

  

对于内存不足的错误,我们需要收集哪些信息用以诊断呢?</

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值