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