Simple SQL Delete-Anweisung mit Zeitüberschreitung

8

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

    
dgivoni 28.07.2011, 12:01
quelle

5 Antworten

13

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.

    
Damien_The_Unbeliever 28.07.2011, 12:16
quelle
3

das ist sehr merkwürdig. Meine Vermutung ist, dass Sie einen ON DELETE CASCADE-Fremdschlüssel haben, der auf Ihre Benutzer-Tabelle an anderer Stelle in Ihrem Schema verweist. Überprüfen Sie Ihre Einschränkungen:

%Vor%     
Blazes 28.07.2011 12:05
quelle
3

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!

    
Adam Nofsinger 17.08.2015 15:17
quelle
2

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.

    
Paul Williams 28.07.2011 12:25
quelle
0

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.

    
Aaron Bertrand 28.07.2011 12:35
quelle