Excluindo todas as linhas usando TRUNCATE TABLE
A instrução TRUNCATE TABLE é um método rápido e eficiente de excluir todas as linhas em uma tabela. TRUNCATE TABLE é semelhante à instrução DELETE sem uma cláusula WHERE. Portanto, TRUNCATE TABLE é mais rápido e utiliza menos recursos do sistema e do log de transações.
Comparado à instrução DELETE, TRUNCATE TABLE possui as seguintes vantagens:
O espaço utilizado do log de transações é menor.
A instrução DELETE remove as linhas uma de cada vez e registra uma entrada no log de transações para cada linha excluída. TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra somente as desalocações de página no log de transações.
Normalmente são utilizados menos bloqueios.
Quando a instrução DELETE é executada usando um bloqueio de linha, cada linha na tabela é bloqueada para exclusão. TRUNCATE TABLE sempre bloqueia a tabela e a página, mas não cada linha.
Sem exceção, são deixadas na tabela páginas zero.
Após a execução de uma instrução DELETE, a tabela ainda pode conter páginas vazias. Por exemplo, páginas vazias em um heap não podem ser desalocadas sem pelo menos um bloqueio de tabela exclusivo (LCK_M_X). Se a operação de exclusão não usar um bloqueio de tabela, a tabela (heap) conterá muitas páginas vazias. Para índices, a operação de exclusão pode deixar páginas vazias, embora essas páginas sejam desalocadas rapidamente por um processo de limpeza em segundo plano.
Da mesma forma que com DELETE, a definição de uma tabela esvaziada usando TRUNCATE TABLE permanece no banco de dados, junto com seus índices e outros objetos associados. Se a tabela contiver uma coluna de identidade, o contador daquela coluna será redefinido no valor de semente definido para a coluna. Se não for definida nenhuma semente, o valor padrão utilizado será 1. Para manter o contador de identidade, utilize DELETE.
Truncando tabelas grandes
O Microsoft SQL Server introduziu a capacidade de descartar ou truncar tabelas que possuem mais de 128 extensões sem manter bloqueios simultâneos em todas as extensões necessárias para o descarte. Para obter mais informações, consulte Descartando e recriando objetos grandes.
Exemplos
O exemplo a seguir remove todos os dados da tabela JobCandidate. As instruções SELECT são incluídas antes e depois da instrução TRUNCATE TABLE para comparar resultados.
USE AdventureWorks2008R2;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO