TRUNCATE
genererar ingen återställningsdata, vilket gör den blixtsnabb. Det avallokerar bara datasidorna som används av tabellen.
Men om du är i en transaktion och vill ha möjligheten att "ångra" denna borttagning, måste du använda DELETE FROM
, vilket ger möjligheten att återställa.
EDIT: Observera att ovanstående är felaktigt för SQL Server (men det gäller för Oracle). I SQL Server är det möjligt att återställa en trunkeringsoperation om du är inne i en transaktion och transaktionen inte har genomförts. Ur ett SQL Server-perspektiv är en viktig skillnad mellan DELETE FROM och TRUNCATE denna :"DELETE-satsen tar bort rader en i taget och registrerar en post i transaktionsloggen för varje raderad rad. TRUNCATE TABLE tar bort data genom att avallokera datasidorna som används för att lagra tabelldata och registrerar endast sidavallokeringarna i transaktionsloggen ."
Med andra ord, det sker mindre loggning under en TRUNCATE eftersom endast sidavallokeringarna registreras i transaktionsloggen, medan radering av varje rad registreras med en DELETE FROM. Det är en av anledningarna till att TRUNCATE går blixtsnabbt.
Notera också från den MSDN-länken att du inte kan trunkera tabeller som refereras av främmande nyckelbegränsningar, delta i en indexerad vy eller publiceras genom att använda transaktionsreplikering eller sammanslagningsreplikering.
EDIT 2: En annan viktig punkt är att TRUNCATE TABLE kommer att återställa din identitet till det ursprungliga fröet, medan DELETE FROM fortsätter att öka från där det slutade. Referens:Ben Robinsons svar.