Qual é a diferença entre TRUNCATE
e DELETE
no SQL?
Se sua resposta for específica da plataforma, indique isso.
Qual é a diferença entre TRUNCATE
e DELETE
no SQL?
Se sua resposta for específica da plataforma, indique isso.
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.
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.
Excluir é DML, truncar é DDL (o que é DDL e DML? )
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.
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.
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.
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)
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. .
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
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.
Excluir gera uma pequena quantidade de refazer e uma grande quantidade de desfazer. Truncar gera uma quantidade desprezível de cada um.
Oráculo
Uma operação truncada torna índices inutilizáveis utilizáveis novamente. Excluir não.
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.
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.
Os gatilhos DML não são acionados em um truncado.
Oráculo
Os gatilhos DDL estão disponíveis.
Oráculo
Truncar não pode ser emitido por um link de banco de dados.
Servidor SQL
Truncar redefine a sequência para os tipos de coluna IDENTITY, excluir não.
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:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
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) |
+----------------------------------------+----------------------------------------------+
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.
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
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 comando Delete Triggers
não é executado.
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
Com o SQL Server ou MySQL, se houver uma PK com incremento automático, o truncado redefinirá o contador.
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.
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, 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, enquanto DELETE
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 na TRUNCATE
instrução.
TRUNCATE
As instruções não acionam gatilhos em vez de no gatilho de exclusão na DELETE
instrução
Aqui está o link muito bom relevante para o tópico.
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.
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.
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 :
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.
No SQL Server 2005, acredito que você pode reverter um truncado
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ê 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.
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE pode ser revertido se envolvido em uma transação.
Por favor, veja as duas referências abaixo e teste-se: -
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> delete from t1;
10918 rows deleted.
Elapsed: 00:00:00.58
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
1 0 DELETE OF 'T1'
2 1 TABLE 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)
10918 rows processed
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.
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
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.
EXCLUIR
DELETE is a DML command DELETE you can rollback Delete = Only Delete- so it can be rolled back In DELETE you can write conditions using WHERE clause Syntax – Delete from [Table] where [Condition]
TRUNCAR
TRUNCATE is 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) in TRUNCATE Syntax – Truncate table [Table]
Para mais detalhes visite
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
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 é possível fazer DDL em um dblink.
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 também pode ser revertido aqui o exapmle
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
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
Mais uma diferença específica para o servidor sql da microsoft é que delete
você pode usar a output
instrução para rastrear quais registros foram excluídos, por exemplo:
delete from [SomeTable]
output deleted.Id, deleted.Name
Você não pode fazer isso com truncate
.