(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 TRUNCATE
e DELETE
:
- Uso do espaço de log:
TRUNCATE
registra apenas páginas / extensões * liberadas, enquanto DELETE
registra linhas individuais.
- Uso de bloqueio:
TRUNCATE
geralmente usa menos bloqueios, já que são necessários bloqueios de tabela e bloqueios de página, ao contrário dos DELETE
bloqueios de linha **.
IDENTITY
sequências: TRUNCATE
redefine a sequência de identidade em uma tabela, se presente.
(* Uma extensão = 8 páginas. TRUNCATE
Registrará / 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 TABLE
pode 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 TABLE
se você estiver esvaziando a tabela, mas quiser manter a estrutura (NB: TRUNCATE
nã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>' after
TRUNCATE /
DELETE` para que o otimizador de consultas não seja acionado por estatísticas antigas.
TRUNCATE TABLE
vez deDELETE FROM
.