Lo spazio usato da una tabella non viene completamente rilasciato dopo l'uso di un'istruzione DELETE per eliminare i dati dalla tabella in SQL Server

Questo articolo consente di risolvere il problema che una tabella usa non può essere rilasciato dopo l'uso di un'istruzione DELETE per eliminare tutti i dati dalla tabella.

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

Sintomi

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

Impossibile allocare 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 che contiene la tabella.

Causa

Questo problema si verifica perché SQL Server rilascia solo tutte le pagine usate da una tabella heap quando si verificano le condizioni seguenti:

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

Nota

Una tabella heap è qualsiasi tabella non associata a un indice cluster.

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

Tuttavia, quando si abilita un livello di isolamento delle righe versioning-based in un database SQL Server, le pagine non possono essere rilasciate anche se viene mantenuto un blocco a livello di tabella. Per altre informazioni sui livelli di isolamento delle righeversioning-based, vedere Livelli di isolamento nel motore di database SQL Server.

Soluzione alternativa

Per risolvere questo problema, usare uno dei metodi seguenti:

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

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Nota

    <TableName> rappresenta il nome della tabella.

  • Utilizzare l'istruzione TRUNCATE TABLE se si desidera eliminare tutti i record nella tabella. Ad esempio, usare un'istruzione simile alla seguente:

    TRUNCATE TABLE <TableName>
    
  • Creare un indice cluster in una colonna della tabella. Per altre informazioni su come creare un indice cluster in una tabella, vedere Creare indici cluster.