Condividi tramite


Eliminazione di tutte le righe con l'istruzione TRUNCATE TABLE

L'istruzione TRUNCATE TABLE rappresenta un metodo rapido ed efficace per eliminare tutte le righe di una tabella. TRUNCATE TABLE è simile all'istruzione DELETE senza la clausola WHERE, tuttavia è più rapida e utilizza un numero minore di risorse di sistema e del log delle transazioni.

Rispetto all'istruzione DELETE, TRUNCATE TABLE offre i vantaggi seguenti:

  • Viene utilizzato meno spazio del log delle transazioni.

    L'istruzione DELETE rimuove una riga alla volta e registra una voce nel log delle transazioni per ogni riga eliminata. L'istruzione TRUNCATE TABLE rimuove i dati tramite la deallocazione delle pagine di dati utilizzate per archiviare i dati della tabella. Solo le deallocazioni di pagina vengono registrate nel log delle transazioni.

  • Viene in genere utilizzato un numero di blocchi inferiore.

    Se l'istruzione DELETE viene eseguita utilizzando un blocco di riga, ogni riga della tabella viene bloccata per l'eliminazione. TRUNCATE TABLE blocca sempre la tabella e la pagina, ma non ogni riga.

  • Le pagine vuote vengono lasciate nella tabella.

    Dopo che è stata eseguita un'istruzione DELETE, è possibile che nella tabella siano ancora presenti numerose pagine vuote. Ad esempio, non è possibile deallocare le pagine vuote in un heap senza almeno un blocco di tabella esclusivo (LCK_M_X). Se per l'operazione di eliminazione non viene utilizzato un blocco di tabella, la tabella (heap) conterrà numerose pagine vuote. Per gli indici, è possibile che dopo l'eliminazione rimangano pagine vuote, che tuttavia verranno rapidamente deallocate tramite un processo di pulizia in background.

In modo analogo all'istruzione DELETE, la definizione di una tabella che risulta vuota in seguito all'esecuzione di TRUNCATE TABLE rimane nel database insieme a tutti gli indici e agli oggetti associati. Se la tabella include una colonna Identity, il contatore della colonna viene reimpostato sul valore di inizializzazione definito per la colonna. Se non è stato definito alcun valore di inizializzazione, viene utilizzato il valore predefinito 1. Per mantenere il contatore della tabella Identity, utilizzare l'istruzione DELETE.

Troncamento di tabelle di grandi dimensioni

In MicrosoftSQL Server è stata introdotta la possibilità di eliminare o di troncare le tabelle che includono più di 128 extent senza mantenere blocchi simultanei su tutti gli extent necessari per l'eliminazione. Per ulteriori informazioni, vedere Eliminazione e ricostruzione di oggetti di grandi dimensioni.

Esempi

Nell'esempio seguente vengono rimossi tutti i dati dalla tabella JobCandidate. Prima e dopo l'istruzione TRUNCATE TABLE vengono inserite istruzioni SELECT per confrontare i risultati.

USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO