2009-07-23 7 views
0

Ich habe einen einfachen .Net Webdienst erstellt, der eine sehr einfache Abfrage ausführt (die normalerweise sehr schnell sein sollte). Die Abfrage lautet etwa so:.Net 2.0 & SQL Server 2008 Hängender Prozess

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 ist eine Ansicht für Active Directory-Daten. Diese Abfrage erhält im Wesentlichen eine Liste von E-Mail-Adressen, an die der Bericht per E-Mail gesendet werden soll. Meine Berichtstabelle enthält derzeit nur 3 Datensätze. Ich habe versucht, Felder zur Berichtstabelle hinzuzufügen, aber es dauerte ewig, und so fand ich heraus, dass diese Abfrage in einem SQL-Prozess hängen blieb. Früher am Tag erzeugte dieses Skript den folgenden Fehler:

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

... was den hängenden Prozess erklärt, denke ich. Wir haben versucht, es zu töten, aber jetzt ist es in einem Rollback-Zustand und ich denke, wir müssen sql Server neu starten (was meiner Meinung nach seltsam ist, dass eine ausgewählte Abfrage versuchen würde, einen Rollback durchzuführen). Gibt es einen Weg mit SQL Server oder .net, um dies erneut zu verhindern? Oder ein Weg, wie ich diesen Prozess in SQL entfernen kann ... ist es möglich, dass etwas im Thread-Pool hängt? Ich kann immer noch aus der Berichtstabelle auswählen, so dass es keine Tabellensperre gibt, nur wenn ich versuche, diese Tabelle zu ändern, dreht sie nur ihre Räder.

Ich habe nicht viel Erfahrung mit IIS, wie ich keinen Zugriff darauf habe, aber wenn es eine Vorschläge gibt, kann ich es weitergeben.

Edit: könnte dies Ursache sein, weil in meiner catch-Anweisung ich nicht überprüfen, ob die SqlConnection offen ist, und ob es geschlossen ist?

Antwort

0

Zunächst einmal, starten Sie SQL NIE neu, wenn es in einem Wiederherstellungszustand ist (z. B. das Rollback, das Sie oben beschreiben).

ASP.NET Abfragen normalerweise Timeout um 30 oder 60 Sekunden.

Überprüfen Sie, ob die folgenden Felder indiziert sind:

  • dbo.Reporting.ReportID,
  • dbo.Reporting_EmailList.ReportID
  • dbo.Reporting_EmailList.userGUID
  • OtherDB.dbo.V_ActiveDir.objectGUID (in der zugrunde liegenden Tabelle)

Wo befindet sich die AndereDB? Ist es eine verknüpfte Datenbank? Dies könnte ein Teil des Problems sein.

Wie sieht der Abfrageplan für diese Abfrage aus? Kannst du etwas Verdächtiges dort sehen?