Löschen und Neuerstellen großer Objekte
Wenn Sie umfangreiche Indizes löschen oder neu erstellen oder umfangreiche Tabellen löschen oder abschneiden, verschiebt SQL Server 2005-Datenbankmodul den tatsächlichen Zeitpunkt, zu dem die Seitenzuordnung sowie die entsprechenden Sperren aufgehoben werden, bis für die Transaktion ein Commit ausgeführt worden ist. Diese Implementierung unterstützt sowohl Autocommit- als auch explizite Transaktionen in einer Mehrbenutzerumgebung und gilt für umfangreiche Tabellen und Indizes mit über 128 Blöcken.
Database Engine (Datenbankmodul) vermeidet die zum Löschen von großen Objekten erforderlichen Zuordnungssperren durch Aufteilen des Vorgangs in zwei separate Phasen: logisch und physisch.
Während der logischen Phase werden die vorhandenen, von der Tabelle bzw. dem Index verwendeten Zuordnungseinheiten für die Zuordnungsaufhebung markiert und bis zum Commit der Transaktion gesperrt. Bei zu löschenden gruppierten Indizes werden die Datenzeilen kopiert und in neue Zuordnungseinheiten verschoben, die zum Speichern eines neuen gruppierten Index oder eines Heaps erstellt werden. (Handelt es sich um das Neuerstellen eines Index, werden auch die Datenzeilen sortiert.) Wenn ein Rollback ausgeführt werden muss, braucht dabei lediglich diese logische Phase berücksichtigt werden.
Die physische Phase erfolgt, nachdem ein Commit für die Transaktion ausgeführt wurde. Die für die Aufhebung der Zuordnung markierten Zuordnungseinheiten werden batchweise physisch gelöscht. Diese Löschvorgänge werden innerhalb von kurzen Transaktionen im Hintergrund behandelt und erfordern nur wenige Sperren.
Da die physische Phase erst nach dem Commit der Transaktion erfolgt, scheint der Speicherplatz der Tabelle bzw. des Index möglicherweise weiterhin nicht verfügbar zu sein. Ist dieser Speicherplatz jedoch zum Vergrößern der Datenbank erforderlich, bevor die physische Phase abgeschlossen ist, versucht Database Engine (Datenbankmodul), Speicherplatz aus den für die Zuordnungsaufhebung markierten Zuordnungseinheiten zu gewinnen. Verwenden Sie die Katalogsicht sys.allocation_units, um den aktuell von diesen Zuordnungseinheiten verwendeten Speicherplatz zu ermitteln.
Verzögerte Löschvorgänge geben zugeordneten Speicherplatz nicht sofort frei, und verursachen so zusätzlichen Aufwand in Database Engine (Datenbankmodul). Daher werden Tabellen und Indizes mit weniger als 128 Blöcken wie in SQL Server 2000 gelöscht, abgeschnitten und neu erstellt. Dies bedeutet, dass sowohl die logische als auch die physische Phase vor dem Commit der Transaktion erfolgen.