Ich habe ein Skript erstellt, das nacheinander alle Fremdschlüssel aus einer Datenbank löscht:
ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2
Was mich überrascht, ist, dass das Skript viel Zeit in Anspruch nimmt: durchschnittlich 20 Sekunden pro DROP FK. Jetzt verstehe ich, dass das Erstellen eines FK eine große Sache sein kann, weil der Server überprüfen muss, ob die FK-Einschränkung nicht von Anfang an verletzt wird, sondern fallen lässt? Was macht ein Server, wenn er FKs löscht, die so lange dauern? Dies ist sowohl für meine eigene Neugierde als auch um zu verstehen, ob es einen Weg gibt, die Dinge schneller zu machen. In der Lage zu sein, FK zu entfernen (nicht nur zu deaktivieren), würde es mir ermöglichen, während einer Migration viel schneller zu sein und daher die Ausfallzeiten zu minimieren.
quelle
Antworten:
Das Löschen einer Einschränkung erfordert eine Sch-M-Sperre (Schema Modification), die andere Benutzer daran hindert, die Tabelle während der Änderung abzufragen. Sie warten wahrscheinlich darauf, diese Sperre zu erhalten, und müssen warten, bis alle derzeit ausgeführten Abfragen für diese Tabelle abgeschlossen sind.
Eine ausgeführte Abfrage verfügt über eine Sch-S-Sperre (Schema Stability) für die Tabelle und diese Sperre ist mit einer Sch-M-Sperre nicht kompatibel.
Von Sperrmodi, Schemasperren
quelle
Sch-S
Sperre, und ich vermute, dass dies die Hauptursache für die Probleme des OP ist.Ich werde Sie durch ein Beispiel führen, damit Sie sehen können, warum es lange gedauert hat. Erstellen einer leeren Datenbank für diesen Test.
2 Tabellen erstellen.
Erstellen einer Fremdschlüsseleinschränkung für die Personentabelle.
Fügen Sie einige Daten in beide Tabellen ein.
Öffnen Sie ein neues Abfragefenster und führen Sie dieses aus (schließen Sie das Fenster nicht, wenn die Abfrage abgeschlossen ist).
Öffnen Sie ein anderes Abfragefenster und führen Sie dieses aus.
Sie werden feststellen, dass die Drop-Einschränkung weiterhin ausgeführt wird (wartet), und führen Sie nun die Abfrage aus, um festzustellen, warum sie länger ausgeführt wird und auf welche Sperren sie wartet.
Sobald Sie Ihre Einfügeoperation festgeschrieben haben, wird die Drop-Einschränkung sofort abgeschlossen, da die Drop-Anweisung jetzt die erforderliche Sperre erhalten kann.
In Ihrem Fall müssen Sie sicherstellen, dass keine Sitzung über eine kompatible Sperre verfügt, um zu verhindern, dass die Drop-Einschränkung die erforderlichen Sperren erhält.
quelle