Wenn ich diese einfache SQL Delete-Anweisung ausführe, erhalte ich eine Zeitüberschreitung von SQL Server:
%Vor%Es gibt ungefähr 95.000 Datensätze in der Tabelle.
Ich dachte, es könnte wegen der Indizes auf der Tabelle sein, also habe ich alles außer dem Primärschlüssel (Id) gelöscht, der gruppiert ist, aber das half nicht.
Ich habe auch alle Statistiken gelöscht, die ich erstellt habe, aber auch ohne Wirkung.
Was kann ich noch tun, um dies zu optimieren?
Mit freundlichen Grüßen, David
Wie viele Fremdschlüssel verweisen Sie auf die Spalte Id
von Users
, und gibt es Indizes für diese Spalten?
Wenn cascade wie angegeben auf NO_ACTION
festgelegt wird, kann es sein, dass SQL Server für jede dieser Tabellen einen vollständigen Tabellenscan durchführen muss, um sicherzustellen, dass kein Verweis auf Id
95146 vorhanden ist - Ich habe gesehen, dass dies leicht Minuten zu einer Zeit vorher dauert, wenn die anderen Tische groß sind.
Ich habe mit einer DELETE
-Anweisung gekämpft, die dazu führte, dass unser ERP (Epicor 10) -System bei seinem nächtlichen MRP-Durchlauf auslief. Es war ein Löschen mit ein paar Joins und eine der Tabellen, die am Join beteiligt sind, ist ziemlich groß. Die seltsame Sache war, dass, wenn ich das delete in ein SELECT *
für die selbe joins / where-Klausel umwandelte, die Abfrage sofort abgeschlossen würde und ZERO-Ergebnisse hatte (dh die delete-Anweisung machte offensichtlich eine lange, große Tabellenabtastung, aber sie hat eigentlich nichts zum Löschen gefunden).
Was letztendlich geholfen hat, war, dass ich die Select-Statment-Version davon mit Tatsächlichen Ausführungsplan anzeigen aktivierte, und dies hatte einen vorgeschlagenen nicht eindeutigen Index, der zu einer der Tabellen hinzugefügt werden sollte. Nachdem ich diesen Index hinzugefügt hatte, lief die select-Anweisung sofort, aber jetzt auch die delete-Anweisung!
Während Ihre Anweisung ausgeführt wird, sehen Sie sich die Liste der ausgeführten Tasks und Sperren an, die vom System ausgeführt wurden. Sie können diese Informationen vom Aktivitätsmonitor abrufen, oder Sie können sich laufende Aufgaben in der Ansicht ansehen sys.dm_os_waiting_tasks
und sperrt mit exec sp_lock
und sys.dm_tran_locks
.
Geben Sie in SQL Server Management Studio diese Anweisung ein und sehen Sie sich den geschätzten Ausführungsplan an. Vielleicht können Sie sehen, was SQL Server versucht zu tun.
Sehen Sie sich Fremdschlüssel für diese Tabelle an. Möglicherweise müssen Sie einige Indizes zu anderen Tabellen hinzufügen, um Fremdschlüsselassertionen zu optimieren.
Zusätzlich zu den anderen Antworten wird Ihr DELETE möglicherweise durch eine andere Aktivität blockiert (sehen Sie, ob in der Spalte "BlkBy" von sp_who2 ein Wert für Ihr spid vorhanden ist), oder vielleicht gibt es einen Auslöser für die betreffende Tabelle etwas ungesundes. Die meisten der genannten Dinge verlangsamen das Löschen, aber außer in extrem komplizierten Situationen, nicht signifikant genug, um eine Zeitüberschreitung zu verursachen.
Tags und Links sql sql-server sql-server-2008 timeout