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 verwendet haben, um alle Daten aus der Tabelle zu löschen.

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.