代码之家  ›  专栏  ›  技术社区  ›  Peanut

SQL Server 2005-以前快速执行的存储过程在删除并重新创建之前运行缓慢

  •  0
  • Peanut  · 技术社区  · 15 年前

    我有一个存储过程,经过一段时间后,它将开始运行得非常缓慢。它在几秒钟内开始执行生命,最后需要几分钟才能执行。

    我们发现,删除并重新创建过程会导致它在几秒钟内再次执行。

    过程本身包含一些内部联接和一些左侧外部联接,但没有异常。

    为什么它会如此显著地减速?我们应该做些什么来防止这个问题首先发生?

    多谢。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Andrew Savinykh    15 年前

    SQL Server具有称为“参数嗅探”的功能。基本上,第一次运行SP时,创建的执行计划基于传递给该SP的值。使用相同的值再次运行该计划-速度很快,使用不同的值运行该计划。如果这些值对最初生成的执行计划“不利”,则速度可能会非常慢。

    为了避免参数嗅探,可以在存储过程中为每个参数声明一个局部变量,并将参数分配给局部变量。然后在存储过程代码中,只使用变量,而不使用参数。这样,执行计划将不会基于第一次运行时使用的值。

    如果你搜索“SQL参数嗅探”,你也可以找到很多关于这个主题的好文章。

        2
  •  0
  •   Thomas    15 年前

    听起来执行计划不正常。你不必去重新制作它。您应该能够调用sp_recompile,并让它在下次执行时重新编译。当它这样做时,它将构建一个新的执行计划。我要检查的另一件事是,在调用sp_recompile之前,各种表上的统计信息都是最新的,并且是最新的。

        3
  •  0
  •   cjk    15 年前

    除了目前提供的答案之外,您的执行计划还将依赖数据库中的统计信息。如果这些不是最新的,那么执行计划就不能是最佳的。您可以使用以下方法来更新统计信息:

    EXEC sp_updatestats