存储过程间歇性超时!
Posted
技术标签:
【中文标题】存储过程间歇性超时!【英文标题】:Stored procedures are timing out intermittently! 【发布时间】:2010-10-05 15:42:56 【问题描述】:我有许多存储过程,我使用 ExecuteNonQuery
从代码中调用。
一切都很好,但我的两个存储过程今天开始间歇性超时:
超时。超时时间 在完成之前经过 操作或服务器不 回应。该声明已 终止。
如果我从管理工作室手动执行 sp,它仍然很好。
我的数据库中最近没有任何变化 - 我的命令超时是默认值。
有什么线索吗?
编辑
与 SP 的竞争非常激烈 --> 15 Gigs。 重新启动盒子 - 同样的问题,但这次也无法从 Management Studio 运行 sp。
谢谢!
【问题讨论】:
运行时间是否比预期的长得多?或者仅仅是它运行了很长时间但在查询分析器中完成? 它在管理工作室中运行得非常快,这就是为什么我认为设置超时没有帮助 嗯,你需要弄清楚它是否被阻塞,或者你是否有一个糟糕的执行计划...... 【参考方案1】:就我而言,我只是重新组织了操作表的集群索引,超时问题解决了。 select * from table
查询时间也减少到 2 秒,而在重组索引之前几乎是 30 秒 +
【讨论】:
【参考方案2】:获取 SQL 分析器,比较在 Management Studio 中和通过您的应用程序运行它的结果。
【讨论】:
【参考方案3】:SQL Server 在返回给用户之前会无限期地等待。很可能设置了客户端超时属性。例如,您可以设置timeout property for the ADO command object。
【讨论】:
【参考方案4】:好的,我最后就是这样解决的。
包含 4500 万条记录的表上的聚集索引正在杀死我的 SQL 服务器 - 代码中的每次插入都会导致答案中描述的令人讨厌的超时。增加超时容限并不能解决我的可伸缩性问题,所以我尝试使用索引并在主键上设置聚集索引非聚集解决了这种情况。
我很感激 cmets 能够更好地了解这是如何解决问题的。
【讨论】:
PK 是基于整数的吗?如果是这样,那么对顺序数据进行聚类就没有意义了(对吧?)。我在 SQL2000 中遇到过在“修复”索引之前必须完全重新创建表的情况,即使删除/重新索引也无法修复。 是的,它是一个整数——据我所知,默认情况下它是集群的(我没有明确地集群)【参考方案5】:您可能需要更新数据库的统计信息。最近表上的索引是否也发生了变化?
查看sp的执行计划,看能否找到瓶颈。即使它之前运行正常,它也可能被调整为更有效地运行。
您还返回了多少数据?过去我们遇到过设计不佳的 SQL 问题,直到累积报告开始在结果集中包含更多数据时才会出现。不知道你的 sps 做了什么,很难说这是否可能,但值得一提的是你要调查一下。
【讨论】:
【参考方案6】:尝试重新编译这些程序。我有几次这样的问题并没有找到问题的原因,但重新编译总是有帮助的。
编辑:
要重新编译proc,你去管理工作室,打开程序修改并按F5或执行:EXEC sp_recompile 'proc_name'
【讨论】:
值得一试!我该怎么做? 最好是EXEC sp_recompile 'proc_name' 我已经看到这种情况也发生在视图中,在源表更改后需要重新创建它们。绝对值得一试。 一位匿名用户尝试编辑此答案,这是一个不恰当的编辑,应该是评论,所以我在此处包含他的评论:“我们也遇到了这个问题,并在努力解决问题时使用了上述解决方案找到原因,但最终原因是 SQL Server 参数嗅探。问题和解决方法在此处描述dannykendrick.blogspot.co.nz/2012/08/…"【参考方案7】:Management Studio 对其运行的查询/命令设置无限超时。您的代码数据库连接将有一个默认超时,您可以在 command object 上更改它。
【讨论】:
您可以通过在 SQL Server Profiler 中设置跟踪来检查连接属性。从这里,您将能够看到正在使用的默认超时设置,如果您的代码中没有明确设置值 它在管理工作室上发生得非常快(不到 1 秒),而在我的代码上它在 30 秒左右后超时。 连接超时和命令超时不要混淆,连接超时是连接数据库所需的最长时间 @JohnIdol 您可能想查看查询分析器以了解发生了什么。它可能会给你一些额外的线索。可能会给您一些可以通过查询分析器运行的命令,以查看查询计划是否与通过管理工作室运行的相同。 更改超时是您能做的最糟糕的事情。您需要诊断并找到问题,而不是让它花费更多时间。【参考方案8】:您是否设置了命令超时?您的数据库中的某些内容最近是否发生更改导致此过程需要更长的时间?
如果您必须诊断锁定问题,则需要使用 sp_lock 之类的东西。
你能分享你的一个触发的来源吗?
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx
【讨论】:
我正在进行大量交易 - 直到几个小时前一切都很好 - 不太确定设置更高的超时时间是否会有所帮助。 你可以设置为 0 表示它不会超时 另外,如果它在工作室中速度很快,则可能是事务阻塞了它。您需要使用 sp_lock 进行诊断【参考方案9】:这通常与:
由于过度急切的计划重用导致错误的查询计划 (parameter sniffing) 不同的 SET 选项 - 特别是 ANSI_NULLS 和 CONCAT_NULL_YIELDS_NULL 锁定(您可能有更高的隔离级别) 需要重建索引/更新统计信息/等等SET 选项可能导致某些索引类型不可用(例如,持久计算列上的索引 - 包括“提升的”xml/udf 查询)
【讨论】:
很好地调用参数嗅探 - 特别是与 SQL Server 2000 相关。我知道参数嗅探在 SQL Server 2005 及以后的版本中不是问题。关于如何打击参数嗅探的好文章在这里blogs.msdn.com/khen1234/archive/2005/06/02/424228.aspx 参数嗅探绝对是 SQL Server 的一个问题(直到并包括 2012 年)。我已经能够在所有版本的 SQL 上轻松复制这一点。为每个存储的 proc 参数声明一个局部变量并设置 Localparam1 = Param1 修复每个实例中的超时。多年来一直困扰着我。以上是关于存储过程间歇性超时!的主要内容,如果未能解决你的问题,请参考以下文章