Todas as respostas são específicas da plataforma. Não há comando TRUNCATE no SQL padrão. É, portanto, um recurso proprietário e significa algo diferente para cada fornecedor de DBMS.
Nvogel 08/07
A resposta é muito específica da implementação, como deve ser, pois, como o sqlvogel apontou, este é um comando não padrão (TRUNCATE). Quer deixar esta marcado 'oráculo' ou vamos torná-lo uma resposta estilo comunidade wiki, e colocar nas conseqüências para cada grande RDBMS (Oracle, MS-MSQL, PostgreSQL tudo implementar TRUNCATE ...)
reedstrm
Se a transação for concluída, significa COMMITED, não será possível reverter o comando TRUNCATE, mas ainda podemos reverter o comando DELETE a partir dos arquivos de LOG, pois DELETE write os grava no arquivo de Log, caso seja necessário reverter futuramente a partir dos arquivos de LOG.
Respostas:
272
Aqui está uma lista de diferenças. Eu destaquei os recursos específicos da Oracle e espero que a comunidade possa adicionar também a diferença específica de outros fornecedores. As diferenças comuns à maioria dos fornecedores podem ir diretamente abaixo dos títulos, com as diferenças destacadas abaixo.
Visao geral
Se você deseja excluir rapidamente todas as linhas de uma tabela e tem certeza de que deseja fazê-lo e não possui chaves estrangeiras nas tabelas, um TRUNCATE provavelmente será mais rápido que um DELETE .
Vários problemas específicos do sistema devem ser considerados, conforme detalhado abaixo.
Como um TRUNCATE é DDL, ele envolve duas confirmações, uma antes e outra após a execução da instrução. Portanto, o truncamento não pode ser revertido e uma falha no processo de truncamento emitirá uma confirmação de qualquer maneira.
No entanto, consulte o Flashback abaixo.
Recuperação de espaço
Excluir não recupera espaço, Truncar recupera espaço
Oráculo
Se você usar a cláusula REUSE STORAGE, os segmentos de dados não serão desalocados, o que pode ser marginalmente mais eficiente se a tabela precisar ser recarregada com dados. A marca d'água alta é redefinida.
Escopo da linha
Excluir pode ser usado para remover todas as linhas ou apenas um subconjunto de linhas. Truncar remove todas as linhas.
Oráculo
Quando uma tabela é particionada, as partições individuais podem ser truncadas isoladamente, portanto, é possível uma remoção parcial de todos os dados da tabela.
Tipos de objeto
A exclusão pode ser aplicada a tabelas e tabelas dentro de um cluster. Truncar se aplica apenas a tabelas ou a todo o cluster. (Pode ser específico do Oracle)
Identidade do objeto de dados
Oráculo
Excluir não afeta o ID do objeto de dados, mas truncar atribui um novo ID de objeto de dados, a menos que nunca tenha havido uma inserção na tabela desde a sua criação. Mesmo uma única inserção revertida fará com que um novo ID de objeto de dados seja atribuído no truncamento. .
Flashback (Oracle)
O flashback funciona através de exclusões, mas um truncado impede o flashback para estados anteriores à operação.
No entanto, a partir do 11gR2, o recurso ARQUIVO FLASHBACK permite isso, exceto no Express Edition
A exclusão pode ser concedida em uma tabela a outro usuário ou função, mas não pode ser truncado sem o uso de uma concessão DROP ANY TABLE.
Refazer / Desfazer
Excluir gera uma pequena quantidade de refazer e uma grande quantidade de desfazer. Truncar gera uma quantidade desprezível de cada um.
Índices
Oráculo
Uma operação truncada torna índices inutilizáveis utilizáveis novamente. Excluir não.
Chaves estrangeiras
Um truncado não pode ser aplicado quando uma chave estrangeira ativada faz referência à tabela. O tratamento com exclusão depende da configuração das chaves estrangeiras.
Travamento da mesa
Oráculo
Truncar requer um bloqueio de tabela exclusivo, a exclusão requer um bloqueio de tabela compartilhado. Portanto, desativar os bloqueios de tabela é uma maneira de impedir operações truncadas em uma tabela.
Gatilhos
Os gatilhos DML não são acionados em um truncado.
Oráculo
Os gatilhos DDL estão disponíveis.
Execução Remota
Oráculo
Truncar não pode ser emitido por um link de banco de dados.
Colunas de identidade
Servidor SQL
Truncar redefine a sequência para os tipos de coluna IDENTITY, excluir não.
Conjunto de resultados
Na maioria das implementações, uma DELETEinstrução pode retornar ao cliente as linhas que foram excluídas.
Por exemplo, em um subprograma Oracle PL / SQL, você pode:
DELETEFROM employees_temp
WHERE employee_id =299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Não entenda sua quarta declaração: se eu disser DELETE [ ] FROM Table; então * todas as linhas nessa tabela serão excluídas, a menos que um FK a interrompa. A propósito, acho que isso é específico do SQL Server, você não pode usar TRUNCATE em tabelas com FKs.
Joe Pineda
Mais alguns comentários: Não concordo com a sua terceira declaração, a menos que seja específica da Oracle. Pelo menos com o SQL S., se você EXCLUIR ou TRUNCAR, não recuperará espaço (ou seja, os arquivos do banco de dados não encolhem no disco rígido), a menos que você solicite especificamente.
31909 Joe Pineda
1
Declaração 5TH: você pode reverter um TABLE TRUNCATE no SQL 2008 R2
Eric Labashosky
1
O Postgresql pode reverter um TRUNCATE e, portanto, também não o confirma automaticamente.
Rfusca
5
DELETE retorna o número de linhas excluídas, mas TRUNCATE não. É ponto muito bobo, mas vale a pena mencionar que :)
Deepak Kumar Jha
191
A diferença entre truncar e excluir está listada abaixo:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
Truncar a identidade de redefinição da tabela O que isso significa? Mas, o que dizer de Excluir?
Ravi
1
@jWeaver: significa que quando você define a propriedade Especificação de identidade como True para o campo Chave primária, portanto, quando você insere dados nessa tabela, a coluna da chave primária mantém um valor como 1,2,3,4,5 .... (se a Identity iniciar from 1 e seed é 1) e, quando você truncar a tabela, perderá todo o valor da identidade; portanto, quando você começar a inserir dados nessa tabela novamente, começará a partir de 1 em vez de onde ficou por último. Em DELETE, é reverso, preserva o valor da identidade mesmo após a execução da instrução DELETE. Desculpe pelo erro do segundo ponto de comparação na coluna DELETE na imagem acima.
Bhaumik Patel
Parece que você está respondendo para SQL SERVER
Ravi
4
TRUNCATE e DELETE podem ser revertidos no SQL SERVER . E na 2ª linha DELETE dose não redefinir identidade. Agora, como você pode editar esta postagem? Essa é a coisa ruim de usar imagens no StackOverflow.
Mahmood Jenami
2
Truncar está sendo revertido! (SQL SERVER)
Aimal Khan
55
SOLTA
O comando DROP remove uma tabela do banco de dados. Todas as linhas, índices e privilégios das tabelas também serão removidos. Nenhum gatilho DML será acionado. A operação não pode ser revertida.
TRUNCAR
TRUNCATE remove todas as linhas de uma tabela. A operação não pode ser revertida e nenhum acionador será acionado. Dessa forma, TRUNCATE é mais rápido e não usa tanto espaço para desfazer quanto um DELETE. O bloqueio no nível da tabela será adicionado ao truncar.
EXCLUIR
O comando DELETE é usado para remover linhas de uma tabela. Uma cláusula WHERE pode ser usada para remover apenas algumas linhas. Se nenhuma condição WHERE for especificada, todas as linhas serão removidas. Depois de executar uma operação DELETE, você precisa COMITAR ou ROLLBACK a transação para tornar a alteração permanente ou desfazê-la. Observe que esta operação fará com que todos os gatilhos DELETE na tabela sejam acionados. O bloqueio no nível da linha será adicionado ao excluir.
Ah, gatilhos ... esse é um bom ponto. Vou acrescentar isso à lista que fiz e creditar Polara, se estiver tudo bem.
David Aldridge
O SQL Server não permitirá que você trunque uma tabela com chaves estrangeiras; portanto, seu ponto em cascata pode ser discutível, dependendo da plataforma.
Para esclarecer, isso é para o SQL Server se a tabela tiver uma coluna definida como IDENTITY. Excluir manteria o último ID atribuído automaticamente, enquanto Truncar redefine o contador.
Codewerks
Como a pergunta é marcada como ORACLE, essa resposta está ERRADA, portanto, com voto negativo.
Guy
oops, não vi a tag oracle :) #
mathieu
+1 verdadeiro e redefine para 0 . Se você quiser que seja 1, em vez disso:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB 06/08
Eu adicionei este para a resposta da comunidade, e fez dele um pouco mais amigável para documentar questões específicas de fornecedor
David Aldridge
12
"Truncar não registra nada" está correto. Eu iria além:
Truncar não é executado no contexto de uma transação.
A vantagem da velocidade de truncar sobre excluir deve ser óbvia. Essa vantagem varia de trivial a enorme, dependendo da sua situação.
No entanto, vi truncados involuntariamente quebrar a integridade referencial e violar outras restrições. O poder que você ganha ao modificar dados fora de uma transação deve ser balanceado com a responsabilidade que você herdou ao andar na corda bamba sem rede.
TRUNCATEé a instrução DDL, enquanto DELETEé uma instrução DML. Abaixo estão as diferenças entre os dois:
Como TRUNCATEé uma instrução DDL ( Linguagem de definição de dados ), ela não requer confirmação para tornar as alterações permanentes. E é por esse motivo que as linhas excluídas por truncado não puderam ser revertidas. Por outro lado, DELETEhá uma declaração DML ( Data manipulation language ), portanto, exige confirmação explícita para tornar seu efeito permanente.
TRUNCATEsempre remove todas as linhas de uma tabela, deixando a tabela vazia e a estrutura da tabela intacta, enquanto DELETEpode remover condicionalmente se a cláusula where for usada.
As linhas excluídas pela TRUNCATE TABLEinstrução não podem ser restauradas e você não pode especificar a cláusula where na TRUNCATEinstrução.
TRUNCATEAs instruções não acionam gatilhos em vez de no gatilho de exclusão na DELETEinstrução
Aqui está o link muito bom relevante para o tópico.
TRUNCATE A consulta SQL remove todas as linhas de uma tabela, sem registrar as exclusões de linhas individuais.
TRUNCATE é um comando DDL.
TRUNCATE é executado usando um bloqueio de tabela e a tabela inteira é bloqueada para remover todos os registros.
Não podemos usar a cláusula WHERE com TRUNCATE.
TRUNCATE remove todas as linhas de uma tabela.
Registro mínimo no log de transações, portanto, é mais rápido em termos de desempenho.
TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra apenas as desalocações da página no log de transações.
Para usar Truncar em uma tabela, você precisa pelo menos da permissão ALTER na tabela.
Truncar usa menos espaço de transação que a instrução Delete.
Truncar não pode ser usado com visualizações indexadas.
TRUNCATE é mais rápido que DELETE.
EXCLUIR
Para executar uma fila DELETE, são necessárias permissões de exclusão na tabela de destino. Se você precisar usar uma cláusula WHERE em um DELETE, também serão necessárias permissões de seleção.
DELETE é um comando DML.
DELETE é executado usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão.
Podemos usar a cláusula where com DELETE para filtrar e excluir registros específicos.
O comando DELETE é usado para remover linhas de uma tabela com base na condição WHERE.
Ele mantém o log, portanto, mais lento que TRUNCATE.
A instrução DELETE remove as linhas uma por vez e registra uma entrada no log de transações para cada linha excluída.
A identidade da coluna keep DELETE mantém a identidade.
Para usar Excluir, você precisa da permissão DELETE na tabela.
Excluir usa mais espaço de transação que a instrução Truncar.
Excluir pode ser usado com visualizações indexadas.
Se acidentalmente você removeu todos os dados da tabela usando Excluir / Truncar. Você pode reverter a transação confirmada. Restaure o último backup e execute o log de transações até o momento em que Excluir / Truncar está prestes a acontecer.
Enquanto trabalhamos no banco de dados, estamos usando Excluir e Truncar sem conhecer as diferenças entre eles. Neste artigo, discutiremos a diferença entre Excluir e Truncar no Sql.
Excluir:
Excluir é um comando DML.
A instrução Delete é executada usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão.
Podemos especificar filtros na cláusula where.
Exclui dados especificados se houver condição.
Exclua atividades um gatilho porque a operação é registrada individualmente.
Mais lento que truncado porque mantém registros
Truncar
Truncar é um comando DDL.
Truncar tabela sempre bloqueia a tabela e a página, mas não cada linha. Como remove todos os dados.
Não é possível usar a condição Where.
Remove todos os dados.
A tabela truncar não pode ativar um acionador porque a operação não registra exclusões de linhas individuais.
Desempenho mais rápido em termos de desempenho, porque não mantém nenhum registro.
Nota: Excluir e Truncar ambos podem ser revertidos quando usados com Transação. Se a transação for concluída, os meios confirmados, não podemos reverter o comando Truncar, mas ainda podemos reverter o comando Excluir dos arquivos de log, pois delete write os registra no arquivo de log, caso seja necessário reverter futuramente a partir dos arquivos de log.
Se você tiver uma restrição de chave estrangeira referente à tabela que está tentando truncar, isso não funcionará mesmo que a tabela de referência não possua dados. Isso ocorre porque a verificação de chave estrangeira é feita com DDL em vez de DML. Isso pode ser resolvido desativando temporariamente as restrições de chave estrangeira na tabela.
Excluir tabela é uma operação registrada. Portanto, a exclusão de cada linha é registrada no log de transações, o que a torna lenta. A tabela truncar também exclui todas as linhas de uma tabela, mas não registra a exclusão de cada linha; em vez disso, registra a desalocação das páginas de dados da tabela, o que a torna mais rápida.
~ Se você acidentalmente removeu todos os dados da tabela usando Excluir / Truncar. Você pode reverter a transação confirmada. Restaure o último backup e execute o log de transações até o momento em que Excluir / Truncar está prestes a acontecer.
O comando DELETE é usado para remover linhas de uma tabela. Uma cláusula WHERE pode ser usada para remover apenas algumas linhas. Se nenhuma condição WHERE for especificada, todas as linhas serão removidas. Depois de executar uma operação DELETE, você precisará COMITAR ou ROLLBACK a transação para tornar a alteração permanente ou desfazê-la. Observe que esta operação fará com que todos os gatilhos DELETE na tabela sejam acionados.
TRUNCAR
TRUNCATE remove todas as linhas de uma tabela. A operação não pode ser revertida e nenhum acionador será acionado. Como tal, TRUCATE é mais rápido e não usa tanto espaço para desfazer quanto um DELETE.
SOLTA
O comando DROP remove uma tabela do banco de dados. Todas as linhas, índices e privilégios das tabelas também serão removidos. Nenhum gatilho DML será acionado. A operação não pode ser revertida.
DROP e TRUNCATE são comandos DDL, enquanto DELETE é um comando DML. Portanto, as operações DELETE podem ser revertidas (desfeitas), enquanto as operações DROP e TRUNCATE não podem ser revertidas.
O TRUNCATE vs. DELETE é uma das perguntas infames durante entrevistas em SQL. Apenas certifique-se de explicá-lo adequadamente ao entrevistador ou isso pode custar-lhe o trabalho. O problema é que muitos não estão cientes, portanto é mais provável que eles considerem a resposta errada se você disser que o YES Truncate pode ser revertido.
Uma pequena correção na resposta original - exclusão também gera quantidades significativas de refazer (como desfazer é protegido por refazer). Isso pode ser visto na saída de rastreamento automático:
SQL>deletefrom t1;10918rows deleted.
Elapsed:00:00:00.58
Execution Plan----------------------------------------------------------0DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)10DELETEOF'T1'21TABLE ACCESS (FULL)OF'T1'(TABLE)(Cost=43 Card=1)Statistics----------------------------------------------------------30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)0 sorts (disk)10918rows processed
seu encadeamento antigo, mas de acordo com meu entendimento truncado, gera apenas uma boa quantidade de refazer logs, onde, como delete, gera desfazer e refazer ambos.
• Remover dados : primeiro, ambos podem ser usados para remover as linhas da tabela.
Mas um DELETE pode ser usado para remover as linhas não apenas de uma tabela, mas também de uma VIEW ou o resultado de um OPENROWSET ou OPENQUERY sujeito aos recursos do provedor.
• Cláusula FROM : com DELETE, você também pode excluir linhas de uma tabela / exibição / linhas_função_limitada com base nas linhas de outra tabela usando outra cláusula FROM. Nessa cláusula FROM, você também pode escrever condições JOIN normais. Na verdade, você pode criar uma instrução DELETE a partir de uma instrução SELECT que não contém nenhuma função agregada, substituindo SELECT por DELETE e removendo os nomes das colunas.
Com TRUNCATE você não pode fazer isso.
• ONDE : UM TRUNCATE não pode ter WHERE Conditions, mas um DELETE pode. Isso significa que, com TRUNCATE, você não pode excluir uma linha ou grupo específico de linhas. TRUNCATE TABLE é semelhante à instrução DELETE sem a cláusula WHERE.
• Desempenho : TRUNCATE TABLE é mais rápido e utiliza menos recursos do sistema e do log de transações. E um dos motivos são os bloqueios usados pelas duas instruções. A instrução DELETE é executada usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão. TRUNCATE TABLE sempre bloqueia a tabela e a página, mas não cada linha.
• Log de transações : a instrução DELETE remove as linhas uma por vez e faz entradas individuais no log de transações para cada linha.
TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra apenas as desalocações da página no log de transações.
• Páginas : depois que uma instrução DELETE é executada, a tabela ainda pode conter páginas vazias. TRUNCATE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela.
• Trigger : TRUNCATE não ativa os gatilhos de exclusão na tabela. Portanto, você deve ter muito cuidado ao usar TRUNCATE. Nunca se deve usar um TRUNCATE se o gatilho de exclusão estiver definido na tabela para executar alguma ação de limpeza ou registro automático quando as linhas forem excluídas.
• Coluna de identidade : com TRUNCATE, se a tabela contiver uma coluna de identidade, o contador dessa coluna será redefinido para o valor inicial definido para a coluna. Se nenhuma semente foi definida, o valor padrão 1 é usado. DELETE não redefine o contador de identidade. Portanto, se você deseja manter o contador de identidade, use DELETE.
• Replicação : DELETE pode ser usado na tabela usada na replicação transacional ou replicação de mesclagem.
Embora TRUNCATE não possa ser usado nas tabelas envolvidas na replicação transacional ou replicação de mesclagem.
• Reversão : a instrução DELETE pode ser revertida.
TRUNCATE também pode ser revertido, desde que esteja incluído em um bloco TRANSACTION e a sessão não esteja fechada. Depois que a sessão for encerrada, você não poderá reverter TRUNCATE.
• Restrições : a instrução DELETE pode falhar se violar um gatilho ou tentar remover uma linha referenciada por dados em outra tabela com uma restrição FOREIGN KEY. Se o DELETE remover várias linhas e qualquer uma das linhas removidas violar um gatilho ou restrição, a instrução será cancelada, um erro será retornado e nenhuma linha será removida.
E se DELETE for usado no modo de exibição, esse modo de exibição deverá ser uma exibição atualizável. TRUNCATE não pode ser usado contra a tabela usada no modo de exibição indexado.
TRUNCATE não pode ser usado contra a tabela referenciada por uma restrição FOREIGN KEY, a menos que uma tabela que tenha uma chave estrangeira que faça referência a si mesma.
Oi Mangal - obrigado pela resposta, principalmente por questões específicas do SQL * Server. Você acha que poderia integrar esses pontos com a resposta do Wiki da Comunidade que foi aceita?
David Aldridge
Sim, mas como e onde? Desculpe, eu sou novo aqui.
Mangal Pardeshi,
"Então, se você deseja manter o contador de identidade, use DELETE", você poderia usarDECLARE @ai as bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC checkident('tablename', RESEED, @ai)
mpag 04/11/16
1
A maior diferença é que truncar não é uma operação registrada enquanto excluir é.
Simplesmente significa que, no caso de uma falha no banco de dados, você não pode recuperar os dados operados por truncado, mas com a exclusão, você pode.
Instrução DELETE: Este comando exclui apenas as linhas da tabela com base na condição fornecida na cláusula where ou exclui todas as linhas da tabela se nenhuma condição for especificada. Mas isso não libera o espaço que contém a tabela.
A sintaxe de uma instrução SQL DELETE é:
DELETE FROM nome_tabela [condição WHERE];
Instrução TRUNCATE: Este comando é usado para excluir todas as linhas da tabela e liberar o espaço que contém a tabela.
DELETEis a DML command
DELETE you can rollbackDelete= Only Delete- so it can be rolled back
InDELETE you can write conditions usingWHERE clause
Syntax –Deletefrom[Table]where[Condition]
TRUNCAR
TRUNCATEis a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause)inTRUNCATE
Syntax –Truncatetable[Table]
Uma outra diferença das duas operações é que, se a tabela contiver uma coluna de identidade, o contador dessa coluna será redefinido 1 (ou para o valor inicial definido para a coluna) em TRUNCATE. DELETE não tem esse efeito.
Em resumo, truncar não registra nada (portanto, é muito mais rápido, mas não pode ser desfeito) enquanto a exclusão é registrada (e pode fazer parte de uma transação maior, reverterá etc). Se você possui dados que não deseja em uma tabela em dev, normalmente é melhor truncar, pois você não corre o risco de preencher o log de transações
Um grande motivo é útil, quando você precisa atualizar os dados em uma tabela de vários milhões de linhas, mas não deseja reconstruí-los. "Excluir *" levaria uma eternidade, enquanto o impacto no desempenho de Truncate seria insignificante.
Não é que o truncado não registre nada no SQL Server. truncate não registra nenhuma informação, mas registra a página de desalocação de dados da tabela na qual você acionou TRUNCATE.
e o registro truncado podem ser recuperados se definirmos a transação no início e podemos recuperar o registro truncado após a reversão. Mas não é possível recuperar registros truncados do backup do log de transações após a transação truncada confirmada.
Truncar e Excluir no SQL são dois comandos que são usados para remover ou excluir dados da tabela. Embora de natureza bastante básica, os dois comandos SQL podem criar muitos problemas até que você esteja familiarizado com os detalhes antes de usá-lo. Uma escolha incorreta de comando pode resultar em um processo muito lento ou pode até explodir o segmento de log, se muitos dados precisarem ser removidos e o segmento de log não for suficiente. É por isso que é fundamental saber quando usar o comando truncar e excluir no SQL, mas antes de usá-los, você deve estar ciente das diferenças entre truncar e excluir e, com base nelas, poderemos descobrir quando DELETE é a melhor opção para remover data ou TRUNCATE devem ser usados para limpar as tabelas.
Ao emitir uma instrução TRUNCATE TABLE, você está instruindo o SQL Server a excluir todos os registros de uma tabela, sem que nenhum processamento de log ou transação ocorra.
A instrução DELETE pode ter uma cláusula WHERE para excluir registros específicos, enquanto a instrução TRUNCATE não requer nenhum e limpa a tabela inteira. Importante, a instrução DELETE registra a data excluída, enquanto a instrução TRUNCATE não.
Mais uma diferença específica para o servidor sql da microsoft é que deletevocê pode usar a outputinstrução para rastrear quais registros foram excluídos, por exemplo:
Respostas:
Aqui está uma lista de diferenças. Eu destaquei os recursos específicos da Oracle e espero que a comunidade possa adicionar também a diferença específica de outros fornecedores. As diferenças comuns à maioria dos fornecedores podem ir diretamente abaixo dos títulos, com as diferenças destacadas abaixo.
Visao geral
Se você deseja excluir rapidamente todas as linhas de uma tabela e tem certeza de que deseja fazê-lo e não possui chaves estrangeiras nas tabelas, um TRUNCATE provavelmente será mais rápido que um DELETE .
Vários problemas específicos do sistema devem ser considerados, conforme detalhado abaixo.
Tipo de instrução
Excluir é DML, truncar é DDL (o que é DDL e DML? )
Confirmar e reverter
Variável por fornecedor
Servidor SQL
Truncar pode ser revertido.
PostgreSQL
Truncar pode ser revertido.
Oráculo
Como um TRUNCATE é DDL, ele envolve duas confirmações, uma antes e outra após a execução da instrução. Portanto, o truncamento não pode ser revertido e uma falha no processo de truncamento emitirá uma confirmação de qualquer maneira.
No entanto, consulte o Flashback abaixo.
Recuperação de espaço
Excluir não recupera espaço, Truncar recupera espaço
Oráculo
Se você usar a cláusula REUSE STORAGE, os segmentos de dados não serão desalocados, o que pode ser marginalmente mais eficiente se a tabela precisar ser recarregada com dados. A marca d'água alta é redefinida.
Escopo da linha
Excluir pode ser usado para remover todas as linhas ou apenas um subconjunto de linhas. Truncar remove todas as linhas.
Oráculo
Quando uma tabela é particionada, as partições individuais podem ser truncadas isoladamente, portanto, é possível uma remoção parcial de todos os dados da tabela.
Tipos de objeto
A exclusão pode ser aplicada a tabelas e tabelas dentro de um cluster. Truncar se aplica apenas a tabelas ou a todo o cluster. (Pode ser específico do Oracle)
Identidade do objeto de dados
Oráculo
Excluir não afeta o ID do objeto de dados, mas truncar atribui um novo ID de objeto de dados, a menos que nunca tenha havido uma inserção na tabela desde a sua criação. Mesmo uma única inserção revertida fará com que um novo ID de objeto de dados seja atribuído no truncamento. .
Flashback (Oracle)
O flashback funciona através de exclusões, mas um truncado impede o flashback para estados anteriores à operação.
No entanto, a partir do 11gR2, o recurso ARQUIVO FLASHBACK permite isso, exceto no Express Edition
Uso do FLASHBACK no Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
Privilégios
Variável
Oráculo
A exclusão pode ser concedida em uma tabela a outro usuário ou função, mas não pode ser truncado sem o uso de uma concessão DROP ANY TABLE.
Refazer / Desfazer
Excluir gera uma pequena quantidade de refazer e uma grande quantidade de desfazer. Truncar gera uma quantidade desprezível de cada um.
Índices
Oráculo
Uma operação truncada torna índices inutilizáveis utilizáveis novamente. Excluir não.
Chaves estrangeiras
Um truncado não pode ser aplicado quando uma chave estrangeira ativada faz referência à tabela. O tratamento com exclusão depende da configuração das chaves estrangeiras.
Travamento da mesa
Oráculo
Truncar requer um bloqueio de tabela exclusivo, a exclusão requer um bloqueio de tabela compartilhado. Portanto, desativar os bloqueios de tabela é uma maneira de impedir operações truncadas em uma tabela.
Gatilhos
Os gatilhos DML não são acionados em um truncado.
Oráculo
Os gatilhos DDL estão disponíveis.
Execução Remota
Oráculo
Truncar não pode ser emitido por um link de banco de dados.
Colunas de identidade
Servidor SQL
Truncar redefine a sequência para os tipos de coluna IDENTITY, excluir não.
Conjunto de resultados
Na maioria das implementações, uma
DELETE
instrução pode retornar ao cliente as linhas que foram excluídas.Por exemplo, em um subprograma Oracle PL / SQL, você pode:
fonte
A diferença entre truncar e excluir está listada abaixo:
fonte
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
fonte
Todas as boas respostas, às quais devo acrescentar:
Como
TRUNCATE TABLE
é um comando DDL ( Data Defination Language ), não um DML ( Data Manipulation Langauge ), o comandoDelete Triggers
não é executado.fonte
Resumo de Excluir Vs Truncar no SQL Server
Para obter o artigo completo, siga este link: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Retirado do artigo da dotnet mob: Excluir Vs Truncar no SQL Server
fonte
Com o SQL Server ou MySQL, se houver uma PK com incremento automático, o truncado redefinirá o contador.
fonte
DBCC CHECKIDENT (table_name, RESEED, 1)
"Truncar não registra nada" está correto. Eu iria além:
Truncar não é executado no contexto de uma transação.
A vantagem da velocidade de truncar sobre excluir deve ser óbvia. Essa vantagem varia de trivial a enorme, dependendo da sua situação.
No entanto, vi truncados involuntariamente quebrar a integridade referencial e violar outras restrições. O poder que você ganha ao modificar dados fora de uma transação deve ser balanceado com a responsabilidade que você herdou ao andar na corda bamba sem rede.
fonte
TRUNCATE
é a instrução DDL, enquantoDELETE
é uma instrução DML. Abaixo estão as diferenças entre os dois:Como
TRUNCATE
é uma instrução DDL ( Linguagem de definição de dados ), ela não requer confirmação para tornar as alterações permanentes. E é por esse motivo que as linhas excluídas por truncado não puderam ser revertidas. Por outro lado,DELETE
há uma declaração DML ( Data manipulation language ), portanto, exige confirmação explícita para tornar seu efeito permanente.TRUNCATE
sempre remove todas as linhas de uma tabela, deixando a tabela vazia e a estrutura da tabela intacta, enquantoDELETE
pode remover condicionalmente se a cláusula where for usada.As linhas excluídas pela
TRUNCATE TABLE
instrução não podem ser restauradas e você não pode especificar a cláusula where naTRUNCATE
instrução.TRUNCATE
As instruções não acionam gatilhos em vez de no gatilho de exclusão naDELETE
instruçãoAqui está o link muito bom relevante para o tópico.
fonte
Sim, DELETE é mais lento, TRUNCATE é mais rápido. Por quê?
DELETE deve ler os registros, verificar restrições, atualizar o bloco, atualizar índices e gerar refazer / desfazer. Tudo isso leva tempo.
TRUNCATE simplesmente ajusta um ponteiro no banco de dados para a tabela (a marca d'água alta) e o poof! os dados se foram.
Isso é específico do Oracle, AFAIK.
fonte
TRUNCAR
TRUNCATE A consulta SQL remove todas as linhas de uma tabela, sem registrar as exclusões de linhas individuais.
EXCLUIR
Para executar uma fila DELETE, são necessárias permissões de exclusão na tabela de destino. Se você precisar usar uma cláusula WHERE em um DELETE, também serão necessárias permissões de seleção.
fonte
Se acidentalmente você removeu todos os dados da tabela usando Excluir / Truncar. Você pode reverter a transação confirmada. Restaure o último backup e execute o log de transações até o momento em que Excluir / Truncar está prestes a acontecer.
As informações relacionadas abaixo são de uma postagem de blog :
fonte
No SQL Server 2005, acredito que você pode reverter um truncado
fonte
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
fonte
TRUNCATE pode ser revertido se envolvido em uma transação.
Por favor, veja as duas referências abaixo e teste-se: -
http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/
http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx
O TRUNCATE vs. DELETE é uma das perguntas infames durante entrevistas em SQL. Apenas certifique-se de explicá-lo adequadamente ao entrevistador ou isso pode custar-lhe o trabalho. O problema é que muitos não estão cientes, portanto é mais provável que eles considerem a resposta errada se você disser que o YES Truncate pode ser revertido.
fonte
Uma pequena correção na resposta original - exclusão também gera quantidades significativas de refazer (como desfazer é protegido por refazer). Isso pode ser visto na saída de rastreamento automático:
fonte
Aqui está a minha resposta detalhada em a diferença entre DELETE e TRUNCATE no SQL Server
• Remover dados : primeiro, ambos podem ser usados para remover as linhas da tabela.
Mas um DELETE pode ser usado para remover as linhas não apenas de uma tabela, mas também de uma VIEW ou o resultado de um OPENROWSET ou OPENQUERY sujeito aos recursos do provedor.
• Cláusula FROM : com DELETE, você também pode excluir linhas de uma tabela / exibição / linhas_função_limitada com base nas linhas de outra tabela usando outra cláusula FROM. Nessa cláusula FROM, você também pode escrever condições JOIN normais. Na verdade, você pode criar uma instrução DELETE a partir de uma instrução SELECT que não contém nenhuma função agregada, substituindo SELECT por DELETE e removendo os nomes das colunas.
Com TRUNCATE você não pode fazer isso.
• ONDE : UM TRUNCATE não pode ter WHERE Conditions, mas um DELETE pode. Isso significa que, com TRUNCATE, você não pode excluir uma linha ou grupo específico de linhas. TRUNCATE TABLE é semelhante à instrução DELETE sem a cláusula WHERE.
• Desempenho : TRUNCATE TABLE é mais rápido e utiliza menos recursos do sistema e do log de transações. E um dos motivos são os bloqueios usados pelas duas instruções. A instrução DELETE é executada usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão. TRUNCATE TABLE sempre bloqueia a tabela e a página, mas não cada linha.
• Log de transações : a instrução DELETE remove as linhas uma por vez e faz entradas individuais no log de transações para cada linha.
TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra apenas as desalocações da página no log de transações.
• Páginas : depois que uma instrução DELETE é executada, a tabela ainda pode conter páginas vazias. TRUNCATE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela.
• Trigger : TRUNCATE não ativa os gatilhos de exclusão na tabela. Portanto, você deve ter muito cuidado ao usar TRUNCATE. Nunca se deve usar um TRUNCATE se o gatilho de exclusão estiver definido na tabela para executar alguma ação de limpeza ou registro automático quando as linhas forem excluídas.
• Coluna de identidade : com TRUNCATE, se a tabela contiver uma coluna de identidade, o contador dessa coluna será redefinido para o valor inicial definido para a coluna. Se nenhuma semente foi definida, o valor padrão 1 é usado. DELETE não redefine o contador de identidade. Portanto, se você deseja manter o contador de identidade, use DELETE.
• Replicação : DELETE pode ser usado na tabela usada na replicação transacional ou replicação de mesclagem.
Embora TRUNCATE não possa ser usado nas tabelas envolvidas na replicação transacional ou replicação de mesclagem.
• Reversão : a instrução DELETE pode ser revertida.
TRUNCATE também pode ser revertido, desde que esteja incluído em um bloco TRANSACTION e a sessão não esteja fechada. Depois que a sessão for encerrada, você não poderá reverter TRUNCATE.
• Restrições : a instrução DELETE pode falhar se violar um gatilho ou tentar remover uma linha referenciada por dados em outra tabela com uma restrição FOREIGN KEY. Se o DELETE remover várias linhas e qualquer uma das linhas removidas violar um gatilho ou restrição, a instrução será cancelada, um erro será retornado e nenhuma linha será removida.
E se DELETE for usado no modo de exibição, esse modo de exibição deverá ser uma exibição atualizável. TRUNCATE não pode ser usado contra a tabela usada no modo de exibição indexado.
TRUNCATE não pode ser usado contra a tabela referenciada por uma restrição FOREIGN KEY, a menos que uma tabela que tenha uma chave estrangeira que faça referência a si mesma.
fonte
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
A maior diferença é que truncar não é uma operação registrada enquanto excluir é.
Simplesmente significa que, no caso de uma falha no banco de dados, você não pode recuperar os dados operados por truncado, mas com a exclusão, você pode.
Mais detalhes aqui
fonte
Instrução DELETE: Este comando exclui apenas as linhas da tabela com base na condição fornecida na cláusula where ou exclui todas as linhas da tabela se nenhuma condição for especificada. Mas isso não libera o espaço que contém a tabela.
A sintaxe de uma instrução SQL DELETE é:
DELETE FROM nome_tabela [condição WHERE];
Instrução TRUNCATE: Este comando é usado para excluir todas as linhas da tabela e liberar o espaço que contém a tabela.
fonte
EXCLUIR
TRUNCAR
Para mais detalhes visite
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
fonte
Uma outra diferença das duas operações é que, se a tabela contiver uma coluna de identidade, o contador dessa coluna será redefinido 1 (ou para o valor inicial definido para a coluna) em TRUNCATE. DELETE não tem esse efeito.
fonte
Em resumo, truncar não registra nada (portanto, é muito mais rápido, mas não pode ser desfeito) enquanto a exclusão é registrada (e pode fazer parte de uma transação maior, reverterá etc). Se você possui dados que não deseja em uma tabela em dev, normalmente é melhor truncar, pois você não corre o risco de preencher o log de transações
fonte
Um grande motivo é útil, quando você precisa atualizar os dados em uma tabela de vários milhões de linhas, mas não deseja reconstruí-los. "Excluir *" levaria uma eternidade, enquanto o impacto no desempenho de Truncate seria insignificante.
fonte
Não é possível fazer DDL em um dblink.
fonte
Gostaria de comentar no post de matthieu, mas ainda não tenho o representante ...
No MySQL, o contador de incremento automático é redefinido com truncado, mas não com exclusão.
fonte
Não é que o truncado não registre nada no SQL Server. truncate não registra nenhuma informação, mas registra a página de desalocação de dados da tabela na qual você acionou TRUNCATE.
e o registro truncado podem ser recuperados se definirmos a transação no início e podemos recuperar o registro truncado após a reversão. Mas não é possível recuperar registros truncados do backup do log de transações após a transação truncada confirmada.
fonte
Truncar também pode ser revertido aqui o exapmle
fonte
Truncar e Excluir no SQL são dois comandos que são usados para remover ou excluir dados da tabela. Embora de natureza bastante básica, os dois comandos SQL podem criar muitos problemas até que você esteja familiarizado com os detalhes antes de usá-lo. Uma escolha incorreta de comando pode resultar em um processo muito lento ou pode até explodir o segmento de log, se muitos dados precisarem ser removidos e o segmento de log não for suficiente. É por isso que é fundamental saber quando usar o comando truncar e excluir no SQL, mas antes de usá-los, você deve estar ciente das diferenças entre truncar e excluir e, com base nelas, poderemos descobrir quando DELETE é a melhor opção para remover data ou TRUNCATE devem ser usados para limpar as tabelas.
Consulte cheque clique aqui
fonte
Ao emitir uma instrução TRUNCATE TABLE, você está instruindo o SQL Server a excluir todos os registros de uma tabela, sem que nenhum processamento de log ou transação ocorra.
fonte
A instrução DELETE pode ter uma cláusula WHERE para excluir registros específicos, enquanto a instrução TRUNCATE não requer nenhum e limpa a tabela inteira. Importante, a instrução DELETE registra a data excluída, enquanto a instrução TRUNCATE não.
fonte
Mais uma diferença específica para o servidor sql da microsoft é que
delete
você pode usar aoutput
instrução para rastrear quais registros foram excluídos, por exemplo:Você não pode fazer isso com
truncate
.fonte