Blanksteg som en tabell använder släpps inte helt när du har använt en DELETE-instruktion för att ta bort data från tabellen i SQL Server

Den här artikeln hjälper dig att kringgå problemet som en tabell använder inte kan släppas när du har använt en DELETE-instruktion för att ta bort alla data från tabellen.

Ursprunglig produktversion: SQL Server
Ursprungligt KB-nummer: 913399

Symptom

När du har använt en DELETE-instruktion i Microsoft SQL Server för att ta bort data från en tabell kanske du märker att utrymmet som tabellen använder inte har släppts helt. När du sedan försöker infoga data i databasen kan följande felmeddelande visas:

Det gick inte att allokera utrymme för objektet TableName i databasen DatabaseName eftersom filgruppen PRIMARY är full.

Obs!

TableName representerar namnet på tabellen. DatabaseName representerar namnet på databasen som innehåller tabellen.

Orsak

Det här problemet beror på att SQL Server endast släpper alla sidor som en heap-tabell använder när följande villkor är uppfyllda:

  • En borttagning sker i den här tabellen.
  • Ett lås på tabellnivå hålls kvar.

Obs!

En heap-tabell är en tabell som inte är associerad med ett grupperat index.

Om sidorna inte frigörs kan andra objekt i databasen inte återanvända sidorna.

Men när du aktiverar en radisoleringsnivå versioning-based i en SQL Server databas kan sidor inte släppas även om ett lås på tabellnivå hålls kvar. Mer information om radisoleringsnivåer versioning-based finns i Isoleringsnivåer i SQL Server Database Engine.

Lösning

Använd någon av följande metoder för att lösa det här problemet:

  • Inkludera ett TABLOCK-tips i DELETE-instruktionen om en radversionsbaserad isoleringsnivå inte är aktiverad. Använd till exempel en instruktion som liknar följande:

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Obs!

    <TableName> representerar namnet på tabellen.

  • Använd TRUNCATE TABLE-instruktionen om du vill ta bort alla poster i tabellen. Använd till exempel en instruktion som liknar följande:

    TRUNCATE TABLE <TableName>
    
  • Skapa ett grupperat index i en kolumn i tabellen. Mer information om hur du skapar ett grupperat index i en tabell finns i Skapa klustrade index.