我可以多次运行存储过程并且它不会命中它的缓存:(1665ms 是持续时间列)
但是,如果我随后更改存储过程,则什么都不改变:(240ms 是持续时间列)
问题:如何让存储过程始终快速(在第二次和下一次调用时)
我可以多次运行存储过程并且它不会命中它的缓存:(1665ms 是持续时间列)
但是,如果我随后更改存储过程,则什么都不改变:(240ms 是持续时间列)
问题:如何让存储过程始终快速(在第二次和下一次调用时)
经过一番挖掘,我发现当我最初(重新启动后)使用 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 开发者版。
使用 RECOMPILE 创建存储过程并在运行时重新编译
CREATE PROCEDURE yourprodecurename
WITH RECOMPILE
AS
--your code here
GO
然后以这种方式调用它:
EXEC yourprodecurename WITH RECOMPILE
这应该会给您想要的体验,因为当第一次编译或重新编译过程时,过程查询计划会针对数据库的当前状态进行优化。
所以这可以提高程序的处理性能。