1

我可以多次运行存储过程并且它不会命中它的缓存:(1665ms 是持续时间列)

在此处输入图像

但是,如果我随后更改存储过程,则什么都不改变:(240ms 是持续时间列)

在此处输入图像描述

问题:如何让存储过程始终快速(在第二次和下一次调用时)

4

2 回答 2

2

经过一番挖掘,我发现当我最初(重新启动后)使用 NULL applicationID 调用 SP 时

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

然后使用更受限的查询:

执行 [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)

更多细节在这里

全部针对 SQL2012 开发者版。

于 2013-07-17T09:56:45.417 回答
0

使用 RECOMPILE 创建存储过程并在运行时重新编译

CREATE PROCEDURE yourprodecurename
WITH RECOMPILE
AS
    --your code here
GO

然后以这种方式调用它:

EXEC yourprodecurename WITH RECOMPILE

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

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

于 2013-07-16T16:48:32.247 回答