Einfache SQL Server-Insert-Anweisung überschreitet Zeit
Habe ich eine einfache Tabelle mit 6 Spalten. Die meisten der Zeit alle insert-Anweisungen funktioniert es ganz gut, aber einmal in eine Weile, ich bin immer ein DB Timeout-Ausnahme:
Timeout ist abgelaufen. Das Zeitlimit wurde vor Abschluss des Vorgangs oder der server antwortet nicht. Die Anweisung wurde beendet.
Timeout ist auf 10 Sekunden eingestellt.
Sollte ich erwähnen, dass ich mit NHibernate und dass die Aussage auch eine "select SCOPE_IDENTITY()" direkt nach dem einfügen selbst.
Mein Gedanke war, dass die Tabelle gesperrt wurde oder so etwas, aber es waren keine anderen Anweisungen ausgeführt, die auf die Tabelle zu diesem Zeitpunkt.
Alle die Einsätze sind sehr einfach, sieht alles ganz normal im sql profiler, hat die Tabelle keine Indizes, aber die PK (Seite fülle: 98.57 %).
Irgendwelche Ideen auf was sollte ich achten?
Dank.
InformationsquelleAutor der Frage Meidan Alon | 2009-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Ihr wahrscheinlichste Ursache ist eine Blockierung Sperre von einer anderen Transaktion (oder vielleicht von einem trigger oder sonst etwas, das hinter den kulissen).
Der einfachste Weg, zu sagen ist kick-off der
INSERT
und während es aufgehängt, laufenEXEC SP_WHO2
in einem anderen Fenster auf dem gleichen server. Dies wird eine Liste aller aktuellen Datenbank-Aktivität, und eine Spalte mit dem NamenBLK
wird zeigen, wenn alle Prozesse sind derzeit blockiert. Überprüfen Sie dieSPID
Ihrer reagierende Verbindung, um zu sehen, ob es etwas in derBLK
Spalte, und wenn es das tut, das ist der Prozess, der blockiert Sie.Selbst wenn Sie nicht denken, es gibt andere Anweisungen ausgeführt werden, der einzige Weg, um sicher wissen, ist die Liste der aktuellen Transaktionen mit dem SP so ein.
InformationsquelleAutor der Antwort SqlRyan
Diese Frage scheint wie ein guter Ort für ein code-snippet, die ich verwendet, um zu sehen, die den tatsächlichen SQL-text der blockierten und blockierenden Abfragen.
Dem snippet unten beschäftigt die Konvention, dass
SP_WHO2
gibt " ." text fürBlockedBy
für die nicht-blockierte Abfragen, und so filtert Sie heraus und gibt den SQL-text der übrigen Abfragen (sowohl für "Opfer" und "Täter"):InformationsquelleAutor der Antwort andreister
Könnte sein, dass die Tabelle für eine lange Zeit, um zu wachsen.
Wenn Sie die Tabelle weiter wachsen, indem eine große Menge, und nicht instant file initialization aktiviert, dann wird die Abfrage könnte sicherlich timeout jeder einmal in eine Weile.
Überprüfen Sie in diesem Durcheinander aus: MSDN
InformationsquelleAutor der Antwort
Was über die Erklärungen laufen gegen andere Tabellen als Teil einer Transaktion? Das könnte sperren lassen auf die problem-Tabelle.
Überprüfen Sie auch für die log-Datei oder datafile Wachstum geschieht in der Zeit, wenn Sie mit SQL2005 es zeigen würde, in der Sie die Fehlerprotokolle von SQL.
InformationsquelleAutor der Antwort SqlACID
Unserer QA hatte einige Excel-verbindungen, die zurückgegeben große Ergebnis-sets, diese Abfragen habe angehalten mit WaitType von ASYNC_NETWORK_IO für einige Zeit. Während dieser Zeit alle anderen Abfragen Zeitüberschreitung, so dass spezifische stecken Sie hatte nichts mit ihm zu tun.
InformationsquelleAutor der Antwort Meidan Alon
Blick auf die Fragmentierung der Tabelle, Sie könnten immer Seite teilt, weil der
InformationsquelleAutor der Antwort SQLMenace