【问题标题】:Why is calling a stored procedure slower than running the code within the stored procedure?为什么调用存储过程比在存储过程中运行代码慢?
【发布时间】:2010-12-03 05:19:43
【问题描述】:

我有一个存储过程需要一分钟才能运行。如果我在存储过程中获取代码并直接运行它,大约需要 20 秒。我想不出任何会导致这种情况的事情......

如果我查看执行计划,它们是不同的,但是在查询本身上获取执行计划会增加与存储过程调用相同的时间。

我尝试使用该查询创建一个新的存储过程,但它和旧的一样慢......

【问题讨论】:

  • 发布代码。没有这个,我们只能猜测。

标签: sql-server-2005 tsql stored-procedures


【解决方案1】:

我完全是从 Grant Fritchey 那里偷来的,但至少我给予了他应有的信任:

参数嗅探通常是这种情况的原因。当您将查询仅作为查询运行时,所有参数都是本地参数,因此 SQL Server 可以查看、嗅探它们并根据值确定执行计划。只要将参数放入存储过程,SQL Server 就会正确地假定参数中的未知值,并创建不同的执行计划。在大多数情况下,这很有效。在某些情况下,它不会。

【讨论】:

  • 我能做些什么吗?
  • 在这里查看 Gail Shaw 的短文:sqlinthewild.co.za/index.php/2007/11/27/parameter-sniffing
  • 顺便说一句,我在另一个技术问答网站上问过同样的问题,所以我很熟悉(这就是上面引用的来源)。一个基本的答案是使用局部变量。
【解决方案2】:

听起来您在运行存储过程时打开了“包括实际执行计划”。如果是这样,请尝试关闭该选项。

【讨论】:

  • 不,我只是在实际尝试查看执行计划时才使用它。
【解决方案3】:

自创建存储过程以来,数据是否可能发生了很大变化/增长?回想一下,存储过程的一个要点是缓存执行计划,这样下次运行就不必这样做了。如果数据随时间发生剧烈变化,则存储过程可能无法正常运行。

要强制 SQL 为存储过程构建新的执行计划并了解更多信息,请转到 here

【讨论】:

  • 我尝试创建一个新的 sproc 只是为了测试它,但没有任何区别。新的 sproc 和旧的一样慢... :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2019-01-21
  • 2012-06-15
相关资源
最近更新 更多