O espaço que uma tabela usa não é totalmente liberado depois que você usa uma instrução DELETE para excluir dados da tabela em SQL Server

Este artigo ajuda você a contornar o problema que uma tabela usa não pode ser liberado depois de usar uma instrução DELETE para excluir todos os dados da tabela.

Versão original do produto: SQL Server
Número de KB original: 913399

Sintomas

Depois de usar uma instrução DELETE na Microsoft SQL Server para excluir dados de uma tabela, você poderá notar que o espaço que a tabela usa não está completamente liberado. Ao tentar inserir dados no banco de dados, você poderá receber a seguinte mensagem de erro:

Não foi possível alocar espaço para o objeto 'TableName' no banco de dados 'DatabaseName' porque o grupo de arquivos 'PRIMARY' está cheio.

Observação

TableName representa o nome da tabela. DatabaseName representa o nome do banco de dados que contém a tabela.

Motivo

Esse problema ocorre porque SQL Server libera apenas todas as páginas que uma tabela de heap usa quando as seguintes condições são verdadeiras:

  • Ocorre uma exclusão nesta tabela.
  • Um bloqueio no nível da tabela está sendo mantido.

Observação

Uma tabela de heap é qualquer tabela que não esteja associada a um índice clusterizado.

Se as páginas não forem desalocadas, outros objetos no banco de dados não poderão reutilizar as páginas.

No entanto, quando você habilita um nível de isolamento de linha versioning-based em um banco de dados SQL Server, as páginas não podem ser liberadas mesmo se um bloqueio no nível da tabela estiver sendo mantido. Para obter mais informações sobre os níveis de isolamento de linhaversioning-based, consulte Níveis de isolamento no Mecanismo de Banco de Dados SQL Server.

Solução alternativa

Para contornar esse problema, use um dos seguintes métodos:

  • Inclua uma dica TABLOCK na instrução DELETE se um nível de isolamento baseado em versão de linha não estiver habilitado. Por exemplo, use uma instrução semelhante à seguinte:

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Observação

    <TableName> representa o nome da tabela.

  • Use a instrução TRUNCATE TABLE se quiser excluir todos os registros na tabela. Por exemplo, use uma instrução semelhante à seguinte:

    TRUNCATE TABLE <TableName>
    
  • Crie um índice clusterizado em uma coluna da tabela. Para obter mais informações sobre como criar um índice clusterizado em uma tabela, consulte Criar Índices Clusterizados.