Delen via


De ruimte die een tabel gebruikt, wordt niet volledig vrijgegeven nadat u een DELETE-instructie hebt gebruikt om gegevens uit de tabel te verwijderen in SQL Server

Dit artikel helpt u bij het oplossen van het probleem dat een tabel gebruikt, niet kan worden vrijgegeven nadat u een DELETE-instructie hebt gebruikt om alle gegevens uit de tabel te verwijderen.

Originele productversie: SQL Server
Origineel KB-nummer: 913399

Symptomen

Nadat u een DELETE-instructie in Microsoft SQL Server hebt gebruikt om gegevens uit een tabel te verwijderen, ziet u mogelijk dat de ruimte die de tabel gebruikt, niet volledig is vrijgegeven. Wanneer u vervolgens gegevens in de database probeert in te voegen, wordt mogelijk het volgende foutbericht weergegeven:

Kan geen ruimte toewijzen voor het object 'TableName' in database 'DatabaseName' omdat de bestandsgroep PRIMARY vol is.

Opmerking

TableName vertegenwoordigt de naam van de tabel. DatabaseName vertegenwoordigt de naam van de database die de tabel bevat.

Oorzaak

Dit probleem treedt op omdat SQL Server alleen alle pagina's vrijgeeft die door een heap-tabel worden gebruikt wanneer aan de volgende voorwaarden wordt voldaan:

  • Er wordt een verwijdering in deze tabel uitgevoerd.
  • Er wordt een vergrendeling op tabelniveau vastgehouden.

Opmerking

Een heap-tabel is een tabel die niet is gekoppeld aan een geclusterde index.

Als de toewijzing van pagina's niet ongedaan wordt gemaakt, kunnen andere objecten in de database de pagina's niet opnieuw gebruiken.

Wanneer u echter een rijisolatieniveau versioning-based inschakelt in een SQL Server database, kunnen pagina's niet worden vrijgegeven, zelfs niet als er een vergrendeling op tabelniveau wordt vastgehouden. Zie Isolatieniveaus in de SQL Server Database-engine voor meer informatie over versioning-based rijisolatieniveaus.

Tijdelijke oplossing

Gebruik een van de volgende methoden om dit probleem te omzeilen:

  • Neem een TABLOCK-hint op in de DELETE-instructie als een isolatieniveau op basis van rijversies niet is ingeschakeld. Gebruik bijvoorbeeld een instructie die vergelijkbaar is met het volgende:

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Opmerking

    <TableName> vertegenwoordigt de naam van de tabel.

  • Gebruik de instructie TRUNCATE TABLE als u alle records in de tabel wilt verwijderen. Gebruik bijvoorbeeld een instructie die vergelijkbaar is met het volgende:

    TRUNCATE TABLE <TableName>
    
  • Maak een geclusterde index op een kolom van de tabel. Zie Geclusterde indexen maken voor meer informatie over het maken van een geclusterde index voor een tabel.