存储过程间歇性地超时!

时间:2009-02-05 11:17:07

标签: sql sql-server stored-procedures timeout sql-server-2000

我从代码ExecuteNonQuery调用了许多存储过程。

这一切都很好但是我的存储过程中有2个在今天间歇性地开始计时:

  

超时已过期。超时期限   在完成之前已经过去了   操作或服务器不是   响应。声明一直如此   终止。

如果我从管理工作室手动执行sp,它仍然很好。

我的数据库中最近没有更改 - 我的命令超时是默认值。

有任何线索吗?

修改

针对SP的表正在运行它的巨大 - > 15演出。 重新启动该框 - 同样的问题,但这次不能让sp从Management Studio运行。

谢谢!

9 个答案:

答案 0 :(得分:7)

Management studio在运行的查询/命令上设置无限超时。您的代码中的数据库连接将具有默认超时,您可以在command object上更改。

答案 1 :(得分:6)

尝试重新编译这些过程。我几次遇到这样的问题并没有找到问题的原因,但重新编译总是有帮助的。

编辑:

要重新编译proc,你去管理工作室,打开程序来修改并点击F5或执行:EXEC sp_recompile'proc_name'

答案 2 :(得分:5)

这通常与:

有关
    由于过度热切的计划重用(parameter sniffing),
  • 错误的查询计划
  • 不同的SET选项 - 特别是ANSI_NULLS和CONCAT_NULL_YIELDS_NULL
  • 锁定(您可能具有更高的隔离级别)
  • 索引需要重建/统计更新/等

SET选项可能导致某些索引类型无法使用(例如,持久计算列的索引 - 包括“提升的”xml / udf查询)

答案 3 :(得分:3)

你是否设置了命令超时?最近你的数据库中有什么东西改变了导致这个过程需要更长的时间?

如果您必须诊断锁定问题,则需要使用类似sp_lock的内容。

你能分享一下你的一个过程的来源吗?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx

答案 4 :(得分:2)

好的 - 这就是我最终修复它的方式。

一个包含4500万条记录的表上的聚簇索引正在杀死我的SQL服务器 - 代码中的每个插入都导致了答案中描述的令人讨厌的超时。增加超时容差并不能解决我的可扩展性问题所以我玩了索引并使主键上的聚簇索引非聚集解锁了这种情况。

我很感激这方面的评论,以便更好地理解这是如何解决问题的。

答案 5 :(得分:1)

您可能需要更新数据库的统计信息。最近还改变了表格的索引吗?

检查sp的执行计划,看看是否能找到瓶颈。即使之前运行正常,也可以调整它以更有效地运行。

您还要返回多少数据?过去,我们遇到过设计不佳的SQL问题,直到累积报告开始在结果集中有更多数据才会显示。不知道你的sps做什么,很难说这是否可能,但值得一提的是你要调查。

答案 6 :(得分:1)

SQL Server将在返回给用户之前无限期地等待。很可能有一个客户端超时属性集。例如,您可以设置timeout property for the ADO command object

答案 7 :(得分:0)

获取SQL分析器,比较在Management Studio中运行它和通过您的应用程序之间的结果。

答案 8 :(得分:0)

就我而言,我刚刚重组了操作表的集群索引,超时问题得以解决。此外,select * from table查询时间减少到2秒,而重组索引之前的时间几乎是30秒+