为什么调用存储过程比在存储过程中运行代码要慢?

时间:2010-12-02 21:03:37

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

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

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

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

3 个答案:

答案 0 :(得分:3)

我从Grant Fritchey那里偷了这个,但至少我给了他适当的信用:

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

自创建存储过程以来,数据是否可能已经发生了很大的变化?回想一下,存储过程的一点是缓存执行计划,以便下次运行不必这样做。如果数据随着时间的推移而急剧变化,则sproc可能也无法正常运行。

要强制SQL为sproc构建新的执行计划并了解更多,请转到here