我有一个存储过程,经过一段时间后会开始非常缓慢地运行。它在几秒钟内开始执行,最终需要几分钟才能执行。
我们发现删除并重新创建该过程会导致它再次在几秒钟内执行。
程序本身包含一些内连接和几个左外连接 - 但没有什么不寻常的。
为什么它应该如此迅速地减速,我们应该做些什么来防止这个问题首先发生?
非常感谢。
答案 0 :(得分:1)
SQL Server有一些叫做“参数嗅探”的东西。基本上,第一次在创建的基础上根据传递给SP的值运行sp执行计划。您使用相同的值再次运行它 - 它很快,您使用不同的值运行它,如果这些值对于最初生成的执行计划来说“不好”,它可能会变得非常慢。
为避免参数嗅探,您可以在存储过程中为每个参数声明一个局部变量,并将参数分配给局部变量。然后在存储过程代码中仅使用变量而不使用参数。这样,执行计划将不会基于您在第一次运行时使用的值。
如果你使用google的sql参数嗅探,你也可以找到很多关于这个主题的好文章。
答案 1 :(得分:0)
这听起来好像执行计划不合适。您不必删除并重新创建它。您应该能够调用sp_recompile并在下次执行时重新编译它。当它这样做时,它将构建一个新的执行计划。我要检查的另一件事是,各种表的统计信息保持最新,并且在调用sp_recompile之前是最新的。
答案 2 :(得分:0)
除了目前为止提供的答案之外,您的执行计划还将依赖于数据库中的统计信息。如果这些不是最新的,则执行计划可能不是最佳的。你可以使用:
来修改统计数据EXEC sp_updatestats