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 beheben, das von einer Tabelle verwendet wird, 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

Problembeschreibung

Nachdem Sie eine DELETE -Anweisung in Microsoft SQL Server zum Löschen von Daten aus einer Tabelle verwendet haben, bemerken Sie möglicherweise, dass der von der Tabelle verwendete Platz nicht vollständig freigegeben ist. Wenn Sie dann versuchen, Daten in die Datenbank einfügen, wird möglicherweise die folgende Fehlermeldung angezeigt:

Speicherplatz für objekt 'TableName' in database 'DatabaseName' konnte nicht 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, SQL Server alle Seiten, die von einer Heaptabelle verwendet werden, nur dann frei, wenn die folgenden Bedingungen zutreffen:

  • Es erfolgt ein Löschvorgang in dieser Tabelle.
  • Eine Sperre auf Tabellenebene wird gehalten.

Hinweis

Eine Heaptabelle ist jede Tabelle, die keinem gruppierten Index zugeordnet ist.

Wenn Seiten nicht neu zugewiesen werden, können die Seiten von anderen Objekten in der Datenbank nicht wiederverwendet werden.

Wenn Sie jedoch eine Zeilenisolationsebene in einer SQL Server 2005-Datenbank aktivieren, können Seiten nicht freigegeben werden, selbst wenn eine Sperre auf versioning-based Tabellenebene aktiviert wird. Weitere Informationen zu Zeilenisolationsebenen finden Sie im Thema versioning-based "Using Row Versioning-based Isolation Levels" in SQL Server 2005 Books Online.

Problemumgehung

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu beheben:

  • Schließen Sie einen TABLOCK-Hinweis in die DELETE-Anweisung ein, wenn eine auf zeilenversionsbasierte Isolationsstufe nicht 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 in einer Spalte der Tabelle. Weitere Informationen zum Erstellen eines gruppierten Indexes in einer Tabelle finden Sie im Thema "Erstellen eines gruppierten Index" in SQL Server Books Online.