Ich habe einen Prozess mit einem Select, dessen Abschluss in der Größenordnung von 5 bis 10 Minuten lange dauert.
Ich verwende NOLOCK derzeit nicht als Hinweis auf das MS SQL-Datenbankmodul.
Gleichzeitig führt ein anderer Prozess Aktualisierungen und Einfügungen in dieselbe Datenbank und dieselben Tabellen durch.
Der erste Prozess wurde vor kurzem gestartet und endet vorzeitig mit einer Nachricht
SQLEXCEPTION: Die Transaktion wurde für Sperrressourcen mit einem anderen Prozess blockiert und als Deadlock-Opfer ausgewählt.
Dieser erste Prozess wird an anderen Standorten unter identischen Bedingungen ausgeführt, jedoch mit kleineren Datenbanken. Daher dauert die betreffende select-Anweisung viel kürzer (in der Größenordnung von etwa 30 Sekunden). Auf diesen anderen Websites wird die Deadlock-Nachricht auf diesen anderen Websites nicht angezeigt. Ich habe diese Nachricht auch nicht auf der Site erhalten, auf der das Problem anfänglich auftritt, aber ich gehe davon aus, dass ich mit dem Wachstum der Datenbank einen bestimmten Schwellenwert überschritten habe. Hier sind meine Fragen:
- Könnte die Zeit, die eine Transaktion benötigt, um ausgeführt zu werden, die Wahrscheinlichkeit erhöhen, dass der zugehörige Prozess als Deadlock-Opfer gekennzeichnet wird.
- Wenn ich die Auswahl mit einem NOLOCK-Hinweis ausführe, wird das Problem dadurch behoben?
- Ich vermute, dass ein Datum / Uhrzeit-Feld, das als Teil der WHERE-Klausel in der select-Anweisung überprüft wird, die langsame Suchzeit verursacht. Kann ich basierend auf diesem Feld einen Index erstellen? Ist es ratsam?