我有一个存储过程,当我想使用exec proc_name
执行它时需要1分钟
如果我从存储过程中复制代码,则将params声明为变量,然后执行代码需要10秒。
怎么了?
我在这里遗失了什么?
我问这个是因为我使用ADO.NET,当我想使用ExecuteNonQuery
执行该存储过程时出现超时错误。
谢谢
答案 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制定了执行计划。