Lo spazio utilizzato da una tabella non è stato completamente rilasciato dopo l'utilizzo di un'istruzione DELETE per eliminare i dati dalla tabella in SQL Server

In questo articolo viene illustrato come risolvere il problema che non è possibile rilasciare una tabella dopo l'utilizzo di un'istruzione DELETE per eliminare tutti i dati dalla tabella.

Versione originale del prodotto:   SQL Server
Numero KB originale:   913399

Sintomi

Dopo aver utilizzato un'istruzione DELETE in Microsoft SQL Server per eliminare i dati da una tabella, è possibile notare che lo spazio utilizzato dalla tabella non è stato completamente rilasciato. Quando si tenta di inserire i dati nel database, è possibile che venga visualizzato il messaggio di errore seguente:

Impossibile allocare lo spazio per l'oggetto 'TableName' nel database 'DatabaseName' perché il filegroup ' Primary ' è pieno.

Nota

TableName rappresenta il nome della tabella. DatabaseName rappresenta il nome del database contenente la tabella.

Causa

Questo problema si verifica perché SQL Server rilascia solo tutte le pagine utilizzate da una tabella di heap quando vengono soddisfatte le condizioni seguenti:

  • Viene eseguita un'eliminazione in questa tabella.
  • Viene mantenuto un blocco a livello di tabella.

Nota

Una tabella heap è una tabella che non è associata a un indice cluster.

Se le pagine non vengono deallocate, gli altri oggetti nel database non potranno riutilizzare le pagine.

Tuttavia, quando si Abilita un versioning-based livello di isolamento delle righe in un database di SQL Server 2005, le pagine non possono essere rilasciate anche se è in corso un blocco a livello di tabella. Per ulteriori informazioni sui livelli di isolamento delle righe versioning-based , vedere l'argomento relativo all'utilizzo dei livelli di isolamento basati sul controllo delle versioni delle righe in SQL Server 2005 Books Online.

Soluzione alternativa

Per ovviare a questo problema, utilizzare uno dei metodi seguenti:

  • Includere un suggerimento di TABLOCK nell'istruzione DELETE se il livello di isolamento basato sul controllo delle versioni delle righe non è abilitato. Ad esempio, utilizzare un'istruzione simile alla seguente:

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Nota

    <TableName> rappresenta il nome della tabella.

  • Se si desidera eliminare tutti i record della tabella, utilizzare l'istruzione TRUNCATE TABLE. Ad esempio, utilizzare un'istruzione simile alla seguente:

    TRUNCATE TABLE <TableName>
    
  • Creare un indice cluster su una colonna della tabella. Per ulteriori informazioni su come creare un indice cluster in una tabella, vedere l'argomento relativo alla creazione di un indice cluster nella documentazione online di SQL Server.