TRUNCATE
non genera alcun dato di rollback, il che lo rende velocissimo. Dealloca semplicemente le pagine di dati utilizzate dalla tabella.
Tuttavia, se sei in una transazione e desideri la possibilità di "annullare" questa eliminazione, devi utilizzare DELETE FROM
, che offre la possibilità di eseguire il rollback.
MODIFICA: Si noti che quanto sopra non è corretto per SQL Server (ma si applica a Oracle). In SQL Server è possibile eseguire il rollback di un'operazione di troncamento se ci si trova all'interno di una transazione e la transazione non è stata salvata. Dal punto di vista di SQL Server, una differenza fondamentale tra DELETE FROM e TRUNCATE è questo :"L'istruzione DELETE rimuove le righe una alla volta e registra una voce nel registro delle transazioni per ogni riga eliminata. TRUNCATE TABLE rimuove i dati deallocando le pagine di dati utilizzate per memorizzare i dati della tabella e registra solo le deallocazioni delle pagine nel registro delle transazioni ."
In altre parole, c'è meno registrazione durante un TRUNCATE perché solo le deallocazioni di pagina vengono registrate nel registro delle transazioni, mentre con un DELETE FROM viene registrata l'eliminazione di ogni riga. Questo è uno dei motivi per cui TRUNCATE è velocissimo.
Nota anche dal collegamento MSDN che non puoi troncare tabelle a cui fanno riferimento vincoli di chiave esterna, partecipare a una visualizzazione indicizzata o pubblicate utilizzando la replica transazionale o la replica di tipo merge.
EDIT 2: Un altro punto chiave è che TRUNCATE TABLE ripristinerà la tua identità al seme iniziale, mentre DELETE FROM continuerà ad aumentare da dove era stato interrotto. Riferimento:risposta di Ben Robinson.