日期:2014-05-18  浏览次数:20771 次

DBCC FREEPROCCACHE [ WITH NO_INFOMSGS ]
各位大牛,帮忙解释一下DBCC FREEPROCCACHE 如果我不加参数 是不是将 缓存中所有原来执行过的执行计划都清除了。如果我加参数的话,是不是就相当于清除指定的执行计划?我用的2005 在2008的联机丛书上面看到了加参数的用法,不懂 请大牛们详细解释,不要复制联机丛书。简单易懂才是王道。

------解决方案--------------------
一般是全部删除,即 DBCC FREEPROCCACHE

参考 http://msdn.microsoft.com/zh-cn/library/ms174283.aspx
------解决方案--------------------
dbcc freeproccache 是清除内存中缓存的执行计划
------解决方案--------------------
你理解是对的,加了参数,就只删除指定的执行计划。
------解决方案--------------------
探讨
我的主要疑问就是 不加参数的DBCC FREEPROCCACHE 和加了参数的 DBCC FREEPROCCACHE 有什么区别。

------解决方案--------------------
DBCC FREEPROCCACHE 不加参数是将缓存中的所有执行计划删除,释放计划缓存将导致系统重新编译存储过程,而不重用缓存中的存储过程。这会导致查询性能暂时性地突然降低! 
--所以我们一般情况下不这样做,我们会根据动态管理视图查看我们想要释放缓存计划的句柄.得到句柄后根据这个16进制的句柄去释放缓存计划.
如果不报内存不足的错误尽量不去清除..
Msg 701, Level 17, State 123, Procedure GetAllRevisions_Monthly, Line 22
There is insufficient system memory in resource pool 'internal' to run this query.
就算是报了这个错误,也别忙着去清除缓存中的计划.毕竟他会对我们的系统造成影响, 我们要确认SQL Server是由于总体的工作负载太高而导致无法分配足够内存执行语句,还是这条语句本身执行的问题.在这个案例中的情形,该存储过程即使在单一用户访问的时候执行,也会 遇到这样的错误,并且在每次执行的时候都会出现同样的错。需要注意的是,这个存储过程在第一次执行的时候,会执行一分钟左右以后,报出错误信息。而当第二 次执行和以后多次执行的时候,都是不到一秒立即报错.
首先需要确认的就是,该内存问题是由于windows的内存缺乏导致的还是SQL Server自身的内存问题导致的。当windows遇到内存压力,没有可用内存的时候,OS被强制在其上运行的所有应用程序释放物理内存。SQL Server在这种情况下,由于buffer pool短时间之内需要释放大量内存并且急剧缩小大小,当时在SQL Server上执行的语句也会报出错误701,没有足够的内存执行语句。但是这个内存错误的本身是由于windows 强制收回内存导致的。我们会在另一个案例中详细讨论这个问题.