0

非常に単純なクエリを実行する単純な.NetWebサービスを作成しました(通常は非常に高速であるはずです)。クエリは次のようなものです。

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は、ActiveDirectoryデータのビューです。このクエリは、基本的に、レポートの電子メール送信先となる電子メールアドレスのリストを取得します。私のレポートテーブルには現在3つのレコードしかありません。レポートテーブルにフィールドを追加しようとしましたが、それは永遠にかかりました。そのため、このクエリがSQLプロセスでハングしていることがわかりました。その日の早い段階で、このスクリプトは次のエラーを生成しました。

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

...これが吊り下げプロセスを説明していると思います。私たちはそれを殺そうとしましたが、今はロールバック状態にあり、SQLサーバーを再起動する必要があるかもしれません(これは、selectクエリがロールバックしようとするのは奇妙です)。これが再び発生するのを防ぐために、SQLサーバーまたは.netのいずれかを使用する方法はありますか?または、SQLでこのプロセスを削除する方法...スレッドプールに何かがぶら下がっている可能性はありますか?レポートテーブルから選択できるので、テーブルロックはありません。このテーブルを変更しようとした場合にのみ、ホイールが回転します。

IISにアクセスできないため、IISの経験はあまりありませんが、提案があればそれを伝えることができます。

編集:これは、catchステートメントで、SqlConnectionが開いているかどうか、および閉じているかどうかを確認しないために発生する可能性がありますか?

4

1 に答える 1

0

まず、SQLが回復状態にある場合は、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 に答える