Der von einer Tabelle verwendete Speicherplatz wird nicht vollständig freigegeben, nachdem Sie eine DELETE-Anweisung zum Löschen von Daten aus der Tabelle in SQL Server
Dieser Artikel hilft Ihnen, das Problem zu umgehen, das eine Tabelle verwendet, kann nicht freigegeben werden, nachdem Sie eine DELETE-Anweisung zum Löschen aller Daten aus der Tabelle verwendet haben.
Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 913399
Symptome
Nachdem Sie eine DELETE-Anweisung in Microsoft SQL Server verwendet haben, um Daten aus einer Tabelle zu löschen, stellen Sie möglicherweise fest, dass der von der Tabelle verwendete Speicherplatz nicht vollständig freigegeben ist. Wenn Sie dann versuchen, Daten in die Datenbank einzufügen, wird möglicherweise die folgende Fehlermeldung angezeigt:
Für das Objekt "TableName" in der Datenbank "DatabaseName" konnte kein Speicherplatz zugewiesen werden, da die Dateigruppe "PRIMARY" voll ist.
Hinweis
TableName stellt den Namen der Tabelle dar. DatabaseName stellt den Namen der Datenbank dar, die die Tabelle enthält.
Ursache
Dieses Problem tritt auf, weil SQL Server nur alle Seiten freigibt, die eine Heaptabelle verwendet, wenn die folgenden Bedingungen erfüllt sind:
- Diese Tabelle wird gelöscht.
- Eine Sperre auf Tabellenebene wird gehalten.
Hinweis
Eine Heaptabelle ist eine beliebige Tabelle, die keinem gruppierten Index zugeordnet ist.
Wenn die Zuordnung von Seiten nicht aufgehoben wird, können andere Objekte in der Datenbank die Seiten nicht wiederverwenden.
Wenn Sie jedoch eine Zeilenisolationsstufe versioning-based
in einer SQL Server Datenbank aktivieren, können Seiten auch dann nicht freigegeben werden, wenn eine Sperre auf Tabellenebene besteht. Weitere Informationen zu Zeilenisolationsstufen versioning-based
finden Sie unter Isolationsstufen in der SQL Server-Datenbank-Engine.
Problemumgehung
Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen:
Fügen Sie einen TABLOCK-Hinweis in die DELETE-Anweisung ein, wenn keine auf Zeilenversionsverwaltung basierende Isolationsstufe aktiviert ist. Verwenden Sie beispielsweise eine -Anweisung, die der folgenden ähnelt:
DELETE FROM <TableName> WITH (TABLOCK)
Hinweis
<TableName> stellt den Namen der Tabelle dar.
Verwenden Sie die TRUNCATE TABLE-Anweisung, wenn Sie alle Datensätze in der Tabelle löschen möchten. Verwenden Sie beispielsweise eine -Anweisung, die der folgenden ähnelt:
TRUNCATE TABLE <TableName>
Erstellen Sie einen gruppierten Index für eine Spalte der Tabelle. Weitere Informationen zum Erstellen eines gruppierten Indexes für eine Tabelle finden Sie unter Erstellen gruppierter Indizes.