2011-09-06 87 views

回答

7

是的。

您可以通过之前和之后做

SELECT * FROM sys.dm_exec_procedure_stats 
where object_id = object_id('YourProc', 'P') 

验证这一点。

TechNet

[情形,其中计划将从缓存中删除包含]全球运营喜欢跑步DBCC FREEPROCCACHE清除从缓存中所有的计划,以及改变单一的程序,如ALTER PROCEDURE,这会从缓存中删除该过程的所有计划。

+0

虽然我确实相信你(因为你有很好的声誉),这是记录在MSDN上的任何地方 – Kane

+0

是的。会找到一个链接。 –

+0

http://msdn.microsoft.com/en-us/library/ms181055.aspx –

4

是的。当然,这是很容易检验一下自己:

  1. 创建过程
  2. 执行了几次
  3. 确认它是通过检查sys.dm_exec_cached_plans
  4. 改变程序
  5. 在该行缓存sys.dm_exec_cached_plans走了
CREATE PROCEDURE dbo.blat AS SELECT 1; 
GO 
EXEC dbo.blat; 
GO 5 

SELECT COUNT(*) 
FROM sys.dm_exec_cached_plans AS p 
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS s 
WHERE [sql].[text] LIKE '%dbo.blat%'; 

ALTER PROCEDURE dbo.blat AS SELECT 22; 
GO 

SELECT COUNT(*) FROM sys.dm_exec_cached_plans AS p 
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS s 
WHERE [sql].[text] LIKE '%dbo.blat%'; 

1

它确实 - 但可能有其他因素。

有时会出现严重的性能问题,我发现明确运行DBCC FREEPROCCACHE可以极大地提高系统的性能。当然,如果你知道它有问题,你也可以明确地清除单个sproc的缓存。

+0

这是在这种情况下,计划缓存充满了大量的单次使用adhoc查询或什么?如果对adhoc工作负载进行优化可能是一种选择。 –

+0

说实话,我已经看过几次了,第一次尝试解决时花了很多时间 - 有承包商和一切。我们从来没有去过这条路线,只是发现在大量数据库更新后有时需要调用'DBCC FREEPROCCACHE'。 – TheCodeKing