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