2014-01-06 108 views
1

太长我有一个存储过程,并且当我想用exec proc_name它需要执行1分钟执行存储过程花费的时间比执行TSQL

如果我复制从存储过程的代码,声明PARAMS作为变量,然后执行代码需要10秒。

怎么了?

我错过了这里的东西?

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

谢谢

+0

你肯定是在执行相同的服务器?相同的数据库? –

+0

阅读关于参数嗅探 – HLGEM

+0

http://www.sommarskog.se/query-plan-mysteries.html –

回答

8

由于使用了不理想的计划而造成的。 你提到s.p.有参数,我有类似的问题,由于'parameter sniffing'

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

这会阻止例如以某些参数为代价优化某些参数值。

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

+0

使用局部变量解决了我的问题! – user3145

2

启动SQL事件探查器,并比较这两个执行:在服务器上花费额外的50分钟?查询是否真的一样?

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

0

尝试启动执行计划图标的执行过程。 它会告诉你究竟哪个部分需要时间,你/我们可以从那里接管(建议)。 谢谢

0

作为一般的想法,当我们谈论adhoc语句vs存储过程时,query plans被缓存。所以执行时间可能会因所选查询计划的不同而有所不同。

至于建议,我认为:

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

sp_recompile <procname> 

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

DBCC FREEPROCCACHE 

3 /对涉及的表Update statistics

4查看两种情况下的实际执行计划并找出性能瓶颈。发布一些代码,我们会为您提供更多详细信息。