it-swarm-pt.tech

A maneira mais rápida de excluir todos os dados em uma tabela grande

Eu tive que excluir todas as linhas de uma tabela de log que continha cerca de 5 milhões de linhas. Minha tentativa inicial foi emitir o seguinte comando no analisador de consultas:

excluir do client_log

o que levou muito tempo.

44
Ron Skufca

Confira tabela truncada que é muito mais rápida.

76
Rob Walker

Eu descobri o TRUNCATE TABLE na referência transact-SQL do msdn. Para todos os interessados, aqui estão as observações:

TRUNCATE TABLE é funcionalmente idêntico à instrução DELETE sem a cláusula WHERE: ambos removem todas as linhas da tabela. Mas TRUNCATE TABLE é mais rápido e usa menos recursos do sistema e do log de transações que DELETE.

A instrução DELETE remove as linhas uma por 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 somente as desalocações da página são registradas no log de transações.

TRUNCATE TABLE remove todas as linhas de uma tabela, mas a estrutura da tabela e suas colunas, restrições, índices e assim por diante permanecem. O contador usado por uma identidade para novas linhas é redefinido para a semente da coluna. Se você deseja manter o contador de identidade, use DELETE. Se você deseja remover a definição da tabela e seus dados, use a instrução DROP TABLE.

Você não pode usar TRUNCATE TABLE em uma tabela referenciada por uma restrição FOREIGN KEY; em vez disso, use a instrução DELETE sem uma cláusula WHERE. Como TRUNCATE TABLE não está registrado, ele não pode ativar um gatilho.

TRUNCATE TABLE não pode ser usado em tabelas que participam de uma exibição indexada.

33
Ron Skufca

Existe um mito comum de que o TRUNCATE ignora o log de transações.

Isso é um mal-entendido e é claramente mencionado no MSDN.

Este mito é invocado em vários comentários aqui. Vamos erradicar juntos;)

15
squadette

Para referência TRUNCATE TABLE também funciona no MySQL

6
UnkwnTech

esqueça truncar e excluir. mantenha suas definições de tabela (caso deseje recriá-lo) e use apenas soltar tabela.

3
siculars

Eu uso o método a seguir para zerar as tabelas, com o bônus adicional de me deixar com uma cópia da tabela.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
3
dar7yl

No SQL Server, você pode usar o Truncate Table comando que é mais rápido que uma exclusão regular e também usa menos recursos. Ele também redefinirá todos os campos de identidade para o valor inicial.

As desvantagens do truncado são que ele não pode ser usado em tabelas referenciadas por chaves estrangeiras e não dispara nenhum gatilho. Além disso, você não poderá reverter os dados se algo der errado.

1
Martynnw

truncate table é não Independente da plataforma SQL. Se você suspeitar que você pode alguma vez alterar os provedores de banco de dados, pode ter receio de usá-lo.

1
James A. Rosen

Observe que TRUNCATE também redefinirá quaisquer teclas de incremento automático, se você as estiver usando.

Se você não deseja perder suas chaves de incremento automático, pode acelerar a exclusão excluindo em conjuntos (por exemplo, DELETE FROM table WHERE id> 1 AND id <10000). Isso irá acelerar significativamente e, em alguns casos, impedir que os dados sejam bloqueados.

1
Brian D.

A sugestão de "Soltar e recriar a tabela" provavelmente não é boa, porque isso altera suas chaves estrangeiras.

Você está usando chaves estrangeiras, certo?

0
Andy Lester

Sim, a exclusão de 5 milhões de linhas provavelmente levará muito tempo. A única maneira potencialmente mais rápida que posso pensar seria largar a mesa e recriá-la. Isso só funciona, é claro, se você deseja excluir TODOS os dados da tabela.

0
TheSmurf

tabela truncada client_log

é sua melhor aposta, o truncado mata todo o conteúdo da tabela e os índices e redefine todas as sementes que você tiver.

0
Ronald Hobbs

Estou revisando minha declaração anterior:

Você deve entender que, usando TRUNCATE, os dados serão limpos, mas nada será registrado no log de transações. Escrever no log é o motivo pelo qual DELETE levará uma eternidade em 5 milhões de linhas. Uso TRUNCATE frequentemente durante o desenvolvimento, mas você deve ser cauteloso ao usá-lo em um banco de dados de produção, porque não poderá reverter suas alterações. Você deve fazer imediatamente um backup completo do banco de dados após fazer um TRUNCATE para estabelecer uma nova base para restauração.

A declaração acima pretendia solicitar que você entendesse que há diferença entre os dois. Infelizmente, ele está mal escrito e faz declarações não suportadas, já que eu realmente não fiz nenhum teste entre os dois. É baseado em declarações que ouvi de outras pessoas.

De MSDN :

A instrução DELETE remove as linhas uma por 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 somente as desalocações da página são registradas no log de transações.

Eu só queria dizer que há uma diferença fundamental entre os dois e, como há uma diferença, haverá aplicativos em que um ou outro pode ser inapropriado.

0
Andy Frieders

Se você não pode usar TRUNCATE TABLE devido a chaves estrangeiras e/ou gatilhos, considere:

  • solte todos os índices;
  • faça o usual DELETE;
  • recrie todos os índices.

Isso pode acelerar DELETE um pouco.

0
squadette