2013-07-16 23 views
1

我可以运行一个存储过程多次,它不会打它的缓存:(1665ms的持续时间列)SQL Server性能快,只有当刷新存储过程

enter image here

但是,如果我再改变存储程序变着法子:(240毫秒时间是列)

enter image description here

问题:如何让存储过程总是要快(在第二个及以后的调用)

回答

2

随着一些挖我发现,当我用NULL称为SP最初(重新启动后)的applicationID

exec [dbo].[usp_Tab32] @responsibleReviewerID=1135,@applicationID=NULL,@environment=1,@userUIStatus=0,@roleID=NULL 

然后用较局限的查询:

EXEC [DBO] [usp_Tab32 ] @ responsibleReviewerID = 1135,@ applicationID = 1406,@ environment = 1,@ userUIStatus = 0,@ roleID = NULL

这样会很慢。

但是,如果我首先遇到更多限制的查询,那么两者都会很快。

要清除关闭数据库计划缓存:

DECLARE @dbId INTEGER 
SELECT @dbId = dbid FROM master.dbo.sysdatabases WHERE name = ‘myDatabase’ 
DBCC FLUSHPROCINDB (@dbId) 

更多细节here

所有针对SQL2012开发版。

+1

值得看看这个:http://www.sommarskog.se/query-plan-mysteries.html特别是OPTIMIZE FOR提示。清理整个计划缓存并不理想,所以如果您可以使用提示,它可以帮助您在繁忙的系统上工作。 – Meff

+0

谢谢梅夫 - 是的同意! –

0

与RECOMPILE创建存储过程,并在运行时编译

然后调用它以这样的方式

EXEC yourprodecurename WITH RECOMPILE 

这应该给你你想要的体验,因为,当一个程序首次编译或重新编译时,过程查询计划针对数据库的当前状态进行了优化。

所以这可以提高程序的处理性能。

+0

非常感谢yeradis。在我的情况下,我发现这降低了性能。 –