(Originalmente, isso foi um comentário à resposta de @ DaveE, mas eu coloquei em sua própria resposta porque demorou muito)
TRUNCATE é uma operação registrada. Tem que ser de outra forma, não é compatível com ACID. No entanto, diferenças entre TRUNCATEe DELETE:
- Uso do espaço de log:
TRUNCATEregistra apenas páginas / extensões * liberadas, enquanto DELETEregistra linhas individuais.
- Uso de bloqueio:
TRUNCATEgeralmente usa menos bloqueios, já que são necessários bloqueios de tabela e bloqueios de página, ao contrário dos DELETEbloqueios de linha **.
IDENTITYsequências: TRUNCATEredefine a sequência de identidade em uma tabela, se presente.
(* Uma extensão = 8 páginas. TRUNCATERegistrará / removerá extensões se todas pertencerem a essa tabela; caso contrário, registrará / removerá páginas de extensões misturadas.
** Um efeito colateral disso é que DELETE FROM TABLEpode deixar páginas vazias alocadas para a tabela, dependendo se a operação pode ou não obter um bloqueio exclusivo da tabela.)
Então (voltando à pergunta original), TRUNCATE TABLEé conclusivamente melhor do que DELETE FROM TABLEse você estiver esvaziando a tabela, mas quiser manter a estrutura (NB: TRUNCATEnão pode ser usado em uma tabela referenciada por uma chave estrangeira de outra tabela).
Conforme observado no comentário de @ Tullo, verifique também o modelo de recuperação do seu banco de dados - se estiver cheio, você precisará começar a fazer backups de log ou alterar seu modelo de recuperação para simples. Depois de fazer uma dessas opções, você provavelmente reduzirá seu arquivo de log como uma operação única (NB: somente arquivo de log ) para recuperar todo esse espaço livre.
Finalmente, outra coisa a ter em atenção - as estatísticas da tabela. execute UPDATE STATISTICS <TABLENAME>' afterTRUNCATE /DELETE` para que o otimizador de consultas não seja acionado por estatísticas antigas.
TRUNCATE TABLEvez deDELETE FROM.