执行存储过程所花费的时间比执行TSQL要长

时间:2014-01-06 14:50:25

标签: sql-server

我有一个存储过程,当我想使用exec proc_name执行它时需要1分钟

如果我从存储过程中复制代码,则将params声明为变量,然后执行代码需要10秒。

怎么了?

我在这里遗失了什么?

我问这个是因为我使用ADO.NET,当我想使用ExecuteNonQuery执行该存储过程时出现超时错误。

谢谢

5 个答案:

答案 0 :(得分:12)

由于使用次优计划而导致。 你提到了s.p.有参数,由于'parameter sniffing'我有类似的问题。

检查这是否是问题的最快检查只是在SP内部将输入参数复制到局部变量中,然后仅使用局部变量。

这会停止,例如某些参数值的优化以牺牲其他参数为代价。

我之前在s.p.其中有一些int参数,其中某些参数值改变了控制流程(以及如何执行查询)。

答案 1 :(得分:2)

启动Sql Profiler并比较这两个执行:是否在服务器上花了额外的50分钟?查询真的一样吗?

您可以复制实际查询文本并手动运行并检查执行计划。

答案 2 :(得分:0)

尝试执行proc并打开执行计划图标。 它会告诉你哪个部分需要时间,你/我们可以从那里接管(建议)。 感谢

答案 3 :(得分:0)

作为一般概念,当我们讨论adhoc语句与存储过程时,query plans的缓存方式不同。因此,执行时间可能不同,因为所选的查询计划可能不同。

作为建议,我想:

1 /使与该存储过程关联的查询计划无效:

sp_recompile <procname>

2 /从缓存中删除所有查询计划(硬件方式,在PROD中不推荐,除非您非常了解后果):

DBCC FREEPROCCACHE

3 / Update statistics涉及的表格。

4 /查看两种情况的实际执行计划,并确定性能瓶颈在哪里。发布一些代码,我们将为您提供有关的更多详细信息。

答案 4 :(得分:0)

选项1.在Alter State中执行SP,然后使用参数重试。

选项2。如果选项1失败,则在查询末尾添加“ option(recompile)”。

例如:从Table1的“按ID排序”选项中选择ID(重新编译)

如果运行速度更快,则速度下降是由于SQL制定了执行计划。