Ich habe eine Tabelle in einer SQL Server-Datenbank mit einem Clustered-Index für den Primärschlüssel. Die Tabelle enthält 1 Million Zeilen. Wenn ich 10K-Zeilen aus der Tabelle lösche, wird der Index während des Löschvorgangs umstrukturiert?
Der Löschvorgang ist Teil der gespeicherten Prozedur. Es kann gleichzeitig mehr als ein Client die gespeicherte Prozedur ausführen. Bei jedem einzelnen Lauf werden jedoch eigene Zeilen gelöscht (die durch den Primärschlüssel eindeutig identifiziert werden). Ich bekomme eine Blockierung der Schlüsselsperre (vom Typ U), wenn mehrere Clients die Prozedur ausführen. Die Blockersperre gehört zu einer Zeile aus derselben Tabelle und ist nicht Teil einer der gleichzeitig ausgeführten Transaktionen. Es sollte keine Blockierung geben, da jeder Lauf versucht, seine eigenen Zeilen zu löschen. Die Eskalation der Sperre findet nicht statt, da sie deaktiviert ist.
Ich vermute, dass der Löschvorgang dazu führen muss, dass der Index neu ausgeglichen wird, und daher kann er während des Umstrukturierungsprozesses eine Schlüsselsperre für jede Zeile der Tabelle vornehmen.
Ich würde mich über jede Meinung dazu sehr freuen.
quelle
Antworten:
Um die Frage im Titel zu beantworten, ob der B-Baum während eines Löschvorgangs neu ausgeglichen wurde, scheint die Antwort zumindest im folgenden minimalen Testfall Nein zu sein.
In der folgenden Demo werden Befehle ausgeführt, die am besten für eine Testumgebung geeignet sind.
Diese Demo zeigt, dass ein Löschvorgang einen sehr unausgeglichenen B-Baum mit praktisch allen Daten auf einer Seite erzeugen kann.
quelle