2009-07-23 113 views
0

我创建了一个简单的.Net Web服务,它运行一个非常简单的查询(通常应该很快)。查询是这样的:.Net 2.0和SQL Server 2008挂起过程

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条记录。我试图将字段添加到报表中,但它一直在持续,这是我如何发现此查询挂在SQL进程中。当天早些时候,该脚本生成以下错误:

Timeout expired. The timeout period elapsed prior to completion 
of the operation or the server is not responding. 

...这解释了悬挂过程,我认为。我们试图杀死它,但现在它处于回滚状态,我想我们可能不得不重新启动sql server(在我看来,选择查询会尝试回滚的奇怪)。有没有办法与SQL服务器或.NET来防止再次发生?或者我可以删除这个过程在SQL中的一种方式...是否有可能挂在线程池?我仍然可以从报表中选择所以没有表锁,只有当我试图改变这个表时,它才会旋转它的轮子。

我对IIS没有太多经验,因为我没有访问权限,但如果有建议,我可以将其传递给您。

编辑:这可能是因为在我的catch语句中,我不检查SqlConnection是否打开,并且它是否关闭?

回答

0

首先,如果它处于恢复状态(例如上面描述的回滚),请不要重新启动SQL。

ASP.NET查询通常在30或60秒时超时。

检查以下字段进行索引:

  • dbo.Reporting.ReportID,
  • dbo.Reporting_EmailList.ReportID
  • dbo.Reporting_EmailList.userGUID
  • OtherDB.dbo.V_ActiveDir.objectGUID (在基础表中)

OtherDB位于何处?它是一个链接的数据库吗?这可能是问题的一部分。

该查询的查询计划是什么样的?你能在那里看到任何可疑的东西吗?