2010-12-02 24 views
1

我有一个需要一分钟才能运行的存储过程。如果我使用存储过程中的代码并直接运行该代码,则需要大约20秒。我想不出任何会导致这种情况的事情......为什么调用存储过程比在存储过程中运行代码慢?

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

我试图与该查询创建一个新的存储过程,但它只是作为一个老慢...

+0

发布代码。没有我们所能做的就是猜测。 – GilaMonster 2010-12-06 01:18:15

回答

3

我完全从格兰特Fritchey偷这一点,但至少我给他适当的信贷:

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

+0

有什么我可以做的吗 – CodeRedick 2010-12-02 21:21:57

0

是否有可能因为存储过程创建数据已经改变/增加了不少?回想一下,存储过程的一点是缓存执行计划,以便下一次运行不必这样做。如果数据随时间剧烈变化,则可能无法正常运行。

要强制SQL来建立一个新的执行计划的存储过程,并了解更多去here

+0

我试图创建一个新的存储过程来测试,并没有区别。新的sproc与旧的sproc一样慢...... :( – CodeRedick 2010-12-02 21:13:15

1

听起来像是你有“包括实际的执行计划”横空当您运行存储过程上。如果是这样,请关闭该选项来尝试。

+0

不,我只有在我实际上试图看看执行计划的时候才有这种想法 – CodeRedick 2010-12-02 21:12:43