我创建了一个简单的.Net Web服务,它运行一个非常简单的查询(通常应该非常快)。查询是这样的:
SELECT v.email
FROM dbo.Reporting r
INNER JOIN dbo.Reporting_EmailList el ON r.reportID = el.reportID
INNER JOIN OtherDB.dbo.V_ActiveDir v ON el.userGUID = v.objectGUID
WHERE r.reportID = @reportID
V_ActiveDir是活动目录数据的视图。此查询基本上为我提供了一个电子邮件地址列表,其中应该通过电子邮件发送报告。我的报告表目前只有3条记录。我试图在Reporting表中添加字段,但这是永远的,这就是我发现这个查询挂在sql进程中的方式。当天早些时候,这个脚本产生了以下错误:
Timeout expired. The timeout period elapsed prior to completion
of the operation or the server is not responding.
...这解释了我认为的悬挂过程。我们试图杀死它,但现在它处于回滚状态,我想我们可能不得不重新启动sql server(在我看来奇怪的是,一个select查询会尝试回滚)。是否有任何方法使用SQL Server或.net来防止再次发生这种情况?或者我可以在sql中删除此进程的方式...是否有可能在线程池中挂起了什么?我仍然可以从报告表中选择所以没有表锁定,只有当我尝试改变这个表时它才会旋转它的轮子。
我没有太多使用IIS的经验,因为我无法访问它,但如果有建议我可以传递它。
编辑:这可能是因为在我的catch语句中我没有检查SqlConnection是否打开,是否关闭它?
答案 0 :(得分:0)
首先,如果SQL处于恢复状态(例如上面描述的回滚),切勿重启SQL。
ASP.NET查询通常会在30或60秒后超时。
检查以下字段是否已编入索引:
OtherDB在哪里?它是链接数据库吗?这可能是问题的一部分。
此查询的查询计划是什么样的?你能看到任何可疑的东西吗?