0

我创建了一个简单的 .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 条记录。我试图将字段添加到报告表中,但它需要很长时间,这就是我发现这个查询挂在 sql 进程中的原因。当天早些时候,此脚本生成了以下错误:

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

...这解释了我认为的悬挂过程。我们试图杀死它,但现在它处于回滚状态,我认为我们可能必须重新启动 sql 服务器(在我看来,选择查询会尝试回滚这很奇怪)。sql server 或 .net 有什么方法可以防止这种情况再次发生吗?或者我可以在 sql 中删除这个进程的一种方法......线程池中是否有可能挂着什么东西?我仍然可以从报告表中进行选择,因此没有表锁定,只有当我尝试更改此表时,它才会旋转它的轮子。

我对 IIS 没有太多经验,因为我无法访问它,但如果有建议,我可以将其传递。

编辑:这可能是因为在我的 catch 语句中我没有检查 SqlConnection 是否打开,以及是否关闭它?

4

1 回答 1

0

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

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

检查以下字段是否被索引:

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

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

此查询的查询计划是什么样的?你能看出那里有什么可疑之处吗?

于 2009-10-22T08:13:13.723 回答