Qual è la differenza tra TRUNCATE
e DELETE
in SQL?
Se la tua risposta è specifica per la piattaforma, ti preghiamo di indicarlo.
Qual è la differenza tra TRUNCATE
e DELETE
in SQL?
Se la tua risposta è specifica per la piattaforma, ti preghiamo di indicarlo.
Risposte:
Ecco un elenco di differenze. Ho messo in evidenza le funzionalità specifiche di Oracle e spero che la community possa aggiungere anche le differenze specifiche di altri fornitori. Le differenze comuni alla maggior parte dei fornitori possono andare direttamente sotto le intestazioni, con le differenze evidenziate di seguito.
Se vuoi eliminare rapidamente tutte le righe da una tabella e sei davvero sicuro di volerlo fare, e non hai chiavi esterne contro le tabelle, allora un TRUNCATE sarà probabilmente più veloce di un DELETE .
Devono essere considerati vari problemi specifici del sistema, come descritto di seguito.
Elimina è DML, Troncato è DDL ( Che cos'è DDL e DML? )
Variabile per fornitore
Server SQL
Troncare può essere ripristinato.
PostgreSQL
Troncare può essere ripristinato.
Oracolo
Poiché un TRUNCATE è DDL, comporta due commit, uno prima e uno dopo l'esecuzione dell'istruzione. Pertanto, il troncamento non può essere ripristinato e un errore nel processo di troncamento avrà comunque emesso un commit.
Tuttavia, vedi Flashback di seguito.
Elimina non recupera spazio, Tronca ripristina spazio
Oracolo
Se si utilizza la clausola REUSE STORAGE, i segmenti di dati non vengono disallocati, il che può essere marginalmente più efficiente se la tabella deve essere ricaricata con i dati. Il segno dell'acqua alta viene ripristinato.
Elimina può essere utilizzato per rimuovere tutte le righe o solo un sottoinsieme di righe. Tronca rimuove tutte le righe.
Oracolo
Quando una tabella viene partizionata, le singole partizioni possono essere troncate in modo isolato, quindi è possibile una parziale rimozione di tutti i dati della tabella.
L'eliminazione può essere applicata a tabelle e tabelle all'interno di un cluster. Troncare si applica solo alle tabelle o all'intero cluster. (Può essere specifico per Oracle)
Oracolo
L'eliminazione non influisce sull'ID oggetto dati, ma il troncamento assegna un nuovo ID oggetto dati a meno che non ci sia mai stato un inserimento contro la tabella dalla sua creazione Anche un singolo inserto che viene eseguito il rollback farà sì che un nuovo ID oggetto dati venga assegnato al troncamento .
Il flashback funziona attraverso le eliminazioni, ma un troncamento impedisce il flashback agli stati prima dell'operazione.
Tuttavia, da 11gR2 la funzione ARCHIVIO FLASHBACK lo consente, tranne che in Express Edition
Uso di FLASHBACK in Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
Variabile
Oracolo
L'eliminazione può essere concessa su una tabella a un altro utente o ruolo, ma il troncamento non può avvenire senza l'utilizzo di una concessione DROP ANY TABLE.
Elimina genera una piccola quantità di ripetizione e una grande quantità di annullamento. Troncare genera una quantità trascurabile di ciascuno.
Oracolo
Un'operazione troncata rende nuovamente utilizzabili gli indici inutilizzabili. Elimina no.
Non è possibile applicare un troncamento quando una chiave esterna abilitata fa riferimento alla tabella. Il trattamento con cancellazione dipende dalla configurazione delle chiavi esterne.
Oracolo
Troncare richiede un blocco tabella esclusivo, l'eliminazione richiede un blocco tabella condiviso. Quindi disabilitare i blocchi di tabella è un modo per impedire le operazioni troncate su una tabella.
I trigger DML non si attivano su un troncato.
Oracolo
I trigger DDL sono disponibili.
Oracolo
Il troncamento non può essere emesso tramite un collegamento al database.
Server SQL
Troncare reimposta la sequenza per i tipi di colonna IDENTITY, l'eliminazione no.
Nella maggior parte delle implementazioni, DELETE
un'istruzione può restituire al client le righe che sono state eliminate.
ad esempio in un sottoprogramma Oracle PL / SQL è possibile:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
La differenza tra troncare ed eliminare è elencata di seguito:
+----------------------------------------+----------------------------------------------+
| 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) |
+----------------------------------------+----------------------------------------------+
FAR CADERE
Il comando DROP rimuove una tabella dal database. Verranno inoltre rimosse tutte le righe, gli indici e i privilegi delle tabelle. Nessun trigger DML verrà attivato. L'operazione non può essere ripristinata.
TRONCARE
TRUNCATE rimuove tutte le righe da una tabella. Non è possibile eseguire il rollback dell'operazione e non verranno attivati trigger. Pertanto, TRUNCATE è più veloce e non utilizza lo spazio di annullamento di un DELETE. Il blocco a livello di tabella verrà aggiunto durante il troncamento.
ELIMINA
Il comando DELETE viene utilizzato per rimuovere le righe da una tabella. Una clausola WHERE può essere utilizzata per rimuovere solo alcune righe. Se non viene specificata alcuna condizione WHERE, tutte le righe verranno rimosse. Dopo aver eseguito un'operazione DELETE è necessario COMMIT o ROLLBACK la transazione per rendere permanente la modifica o annullarla. Notare che questa operazione farà scattare tutti i trigger DELETE sul tavolo. Il blocco a livello di riga verrà aggiunto durante l'eliminazione.
Da: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
Tutte le risposte valide, a cui devo aggiungere:
Poiché TRUNCATE TABLE
è un comando DDL ( Data Defination Language ), non un comando DML ( Data Manipulation Langauge ), il comando Delete Triggers
non viene eseguito.
Riepilogo di Elimina Vs Troncare in SQL Server
Per l'articolo completo, seguire questo link: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Tratto dall'articolo del mob dotnet: Elimina Vs Truncate in SQL Server
Con SQL Server o MySQL, se è presente un PK con incremento automatico, il troncamento ripristinerà il contatore.
DBCC CHECKIDENT (table_name, RESEED, 1)
"Troncare non registra nulla" è corretto. Andrei oltre:
Troncare non viene eseguito nel contesto di una transazione.
Il vantaggio della velocità di troncamento rispetto all'eliminazione dovrebbe essere ovvio. Tale vantaggio varia da banale a enorme, a seconda della situazione.
Tuttavia, ho visto troncare rompere involontariamente l'integrità referenziale e violare altri vincoli. Il potere che ottieni modificando i dati al di fuori di una transazione deve essere bilanciato dalla responsabilità che erediti quando cammini sul filo del rasoio senza una rete.
TRUNCATE
è l'istruzione DDL mentre DELETE
è un'istruzione DML. Di seguito sono le differenze tra i due:
Come un'istruzione TRUNCATE
DDL ( Data definition language ) non richiede un commit per rendere permanenti le modifiche. E questo è il motivo per cui non è stato possibile eseguire il rollback delle righe eliminate da troncato. D'altra parte DELETE
è un'istruzione DML ( Data manipulation language ) quindi richiede un commit esplicito per rendere permanente il suo effetto.
TRUNCATE
rimuove sempre tutte le righe da una tabella, lasciando vuota la tabella e la struttura della tabella intatta, mentre DELETE
può essere rimossa in modo condizionale se viene utilizzata la clausola where.
Le righe eliminate TRUNCATE TABLE
dall'istruzione non possono essere ripristinate e non è possibile specificare la clausola where nell'istruzione TRUNCATE
.
TRUNCATE
dichiarazioni non si aziona trigger a differenza dei sui trigger di eliminazione sulla DELETE
dichiarazione
Ecco l'ottimo link pertinente all'argomento.
Sì, DELETE è più lento, TRUNCATE è più veloce. Perché?
DELETE deve leggere i record, controllare i vincoli, aggiornare il blocco, aggiornare gli indici e generare ripetizione / annullamento. Tutto ciò richiede tempo.
TRUNCATE regola semplicemente un puntatore nel database per la tabella (High Water Mark) e poof! i dati sono spariti.
Questo è specifico per Oracle, AFAIK.
TRONCARE
TRUNCATE La query SQL rimuove tutte le righe da una tabella, senza registrare le singole eliminazioni di riga.
ELIMINA
Per eseguire una coda DELETE, sono richieste autorizzazioni di eliminazione sulla tabella di destinazione. Se è necessario utilizzare una clausola WHERE in DELETE, è necessario selezionare anche le autorizzazioni.
Se accidentalmente hai rimosso tutti i dati dalla tabella usando Elimina / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristinare l'ultimo backup ed eseguire il registro delle transazioni fino al momento in cui Elimina / Tronca sta per verificarsi.
Le informazioni correlate di seguito sono tratte da un post sul blog :
Mentre lavoriamo sul database, stiamo usando Elimina e tronca senza conoscere le differenze tra di loro. In questo articolo discuteremo la differenza tra Elimina e Tronca in SQL.
Elimina:
- Elimina è un comando DML.
- L'istruzione di eliminazione viene eseguita utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione.
- Possiamo specificare i filtri nella clausola where.
- Elimina i dati specificati se esiste la condizione.
- Elimina attività un trigger perché l'operazione viene registrata singolarmente.
- Più lento di Troncare perché mantiene i registri
Troncare
- Troncare è un comando DDL.
- Troncare tabella blocca sempre la tabella e la pagina ma non ogni riga, poiché rimuove tutti i dati.
- Impossibile utilizzare la condizione Where.
- Rimuove tutti i dati.
- La tabella di troncamento non può attivare un trigger poiché l'operazione non registra le singole eliminazioni di riga.
- Più veloce in termini di prestazioni, perché non mantiene alcun registro.
Nota: Elimina e Tronca entrambi possono essere ripristinati quando utilizzati con Transazione. Se Transaction viene eseguita, significa commit, quindi non è possibile eseguire il rollback del comando Truncate, ma possiamo comunque eseguire il rollback del comando Delete dai file di log, poiché delete write li registra nel file di log nel caso in cui sia necessario eseguire il rollback in futuro dai file di log.
Se hai un vincolo di chiave esterna che fa riferimento alla tabella che stai tentando di troncare, questo non funzionerà anche se la tabella di riferimento non contiene dati. Questo perché il controllo della chiave esterna viene eseguito con DDL anziché DML. Questo può essere aggirato disabilitando temporaneamente i vincoli di chiave esterna alla tabella.
Elimina tabella è un'operazione registrata. Quindi la cancellazione di ogni riga viene registrata nel registro delle transazioni, il che rende lento. Troncare tabella inoltre elimina tutte le righe in una tabella, ma non registra l'eliminazione di ogni riga, ma registra la deallocazione delle pagine di dati della tabella, che lo rende più veloce.
~ Se accidentalmente hai rimosso tutti i dati dalla tabella usando Elimina / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristinare l'ultimo backup ed eseguire il registro delle transazioni fino al momento in cui Elimina / Tronca sta per verificarsi.
In SQL Server 2005 credo che sia possibile eseguire il rollback di un troncato
ELIMINA
Il comando DELETE viene utilizzato per rimuovere le righe da una tabella. Una clausola WHERE può essere utilizzata per rimuovere solo alcune righe. Se non viene specificata alcuna condizione WHERE, tutte le righe verranno rimosse. Dopo aver eseguito un'operazione DELETE è necessario COMMIT o ROLLBACK la transazione per rendere permanente la modifica o annullarla. Notare che questa operazione farà scattare tutti i trigger DELETE sul tavolo.
TRONCARE
TRUNCATE rimuove tutte le righe da una tabella. Non è possibile eseguire il rollback dell'operazione e non verranno attivati trigger. Pertanto, TRUCATE è più veloce e non utilizza lo spazio di annullamento di un DELETE.
FAR CADERE
Il comando DROP rimuove una tabella dal database. Verranno inoltre rimosse tutte le righe, gli indici e i privilegi delle tabelle. Nessun trigger DML verrà attivato. L'operazione non può essere ripristinata.
DROP e TRUNCATE sono comandi DDL, mentre DELETE è un comando DML. Pertanto le operazioni DELETE possono essere ripristinate (annullate), mentre le operazioni DROP e TRUNCATE non possono essere ripristinate.
Da: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE può essere ripristinato se inserito in una transazione.
Consulta i due riferimenti seguenti e mettiti alla prova: -
TRUNCATE vs. DELETE è una delle famigerate domande durante le interviste SQL. Assicurati solo di spiegarlo correttamente all'intervistatore o potrebbe costarti il lavoro. Il problema è che non molti sono consapevoli, quindi molto probabilmente considereranno la risposta errata se si dice loro che SI Truncate può essere ripristinato.
Una piccola correzione alla risposta originale - delete genera anche quantità significative di ripetizione (poiché l'annullamento è esso stesso protetto da ripetizione). Questo può essere visto dall'output di autotrace:
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
Ecco la mia risposta dettagliata sulla differenza tra DELETE e TRUNCATE in SQL Server
• Rimuovi dati : per prima cosa, entrambi possono essere utilizzati per rimuovere le righe dalla tabella.
Tuttavia, DELETE può essere utilizzato per rimuovere le righe non solo da una tabella ma anche da una VISTA o dal risultato di OPENROWSET o OPENQUERY in base alle funzionalità del provider.
• Clausola FROM : con DELETE è anche possibile eliminare le righe da una tabella / view / rowset_function_limited in base alle righe di un'altra tabella utilizzando un'altra clausola FROM. In quella clausola FROM puoi anche scrivere le normali condizioni JOIN. In realtà è possibile creare un'istruzione DELETE da un'istruzione SELECT che non contiene alcuna funzione aggregata sostituendo SELECT con DELETE e rimuovendo i nomi di colonna.
Con TRUNCATE non puoi farlo.
• DOVE : un TRUNCATE non può avere le condizioni DOVE, ma un ELIMINA può. Ciò significa che con TRUNCATE non è possibile eliminare una riga specifica o un gruppo specifico di righe. TRUNCATE TABLE è simile all'istruzione DELETE senza clausola WHERE.
• Prestazioni : TRUNCATE TABLE è più veloce e utilizza meno risorse del registro di sistema e delle transazioni. E uno dei motivi sono i blocchi utilizzati da entrambe le istruzioni. L'istruzione DELETE viene eseguita utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione. TRUNCATE TABLE blocca sempre la tabella e la pagina ma non ogni riga.
• Registro delle transazioni : l'istruzione DELETE rimuove le righe una alla volta e crea singole voci nel registro delle transazioni per ogni riga.
TRUNCATE TABLE rimuove i dati deallocando le pagine di dati utilizzate per archiviare i dati della tabella e registra solo le deallocazioni di pagine nel registro delle transazioni.
• Pagine : dopo l'esecuzione di un'istruzione DELETE, la tabella può ancora contenere pagine vuote. TRUNCATE rimuove i dati deallocando le pagine di dati utilizzate per memorizzare i dati della tabella.
• Trigger : TRUNCATE non attiva i trigger di eliminazione sulla tabella. Quindi devi stare molto attento durante l'utilizzo di TRUNCATE. Non si dovrebbe mai usare un TRUNCATE se il trigger di eliminazione è definito nella tabella per eseguire alcune operazioni di pulizia o registrazione automatiche quando le righe vengono eliminate.
• Colonna identità : con TRUNCATE se la tabella contiene una colonna identità, il contatore per quella colonna viene reimpostato sul valore seed definito per la colonna. Se non è stato definito alcun seme, viene utilizzato il valore predefinito 1. DELETE non reimposta il contatore di identità. Quindi, se si desidera conservare il contatore di identità, utilizzare invece ELIMINA.
• Replica : DELETE può essere utilizzato sulla tabella utilizzata nella replica transazionale o nella replica di tipo merge.
Mentre TRUNCATE non può essere utilizzato contro le tabelle coinvolte nella replica transazionale o nella replica di tipo merge.
• Rollback : l'istruzione DELETE può essere ripristinata.
TRUNCATE può anche essere ripristinato a condizione che sia racchiuso in un blocco TRANSAZIONE e che la sessione non sia chiusa. Una volta chiusa la sessione non sarà possibile eseguire il rollback di TRUNCATE.
• Restrizioni : l'istruzione DELETE potrebbe non riuscire se viola un trigger o tenta di rimuovere una riga a cui fanno riferimento i dati in un'altra tabella con un vincolo FOREIGN KEY. Se DELETE rimuove più righe e una delle righe rimosse viola un trigger o un vincolo, l'istruzione viene annullata, viene restituito un errore e nessuna riga viene rimossa.
E se DELETE viene utilizzato su Visualizza, tale vista deve essere una vista aggiornabile. TRUNCATE non può essere utilizzato contro la tabella utilizzata nella vista indicizzata.
TRUNCATE non può essere utilizzato contro la tabella a cui fa riferimento un vincolo FOREIGN KEY, a meno che una tabella che abbia una chiave esterna che faccia riferimento a se stessa.
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
La differenza più grande è che il troncamento è un'operazione non registrata mentre l'eliminazione è.
Significa semplicemente che in caso di arresto anomalo del database, non è possibile ripristinare i dati gestiti da troncato ma con l'eliminazione è possibile.
Maggiori dettagli qui
Istruzione DELETE: questo comando elimina solo le righe dalla tabella in base alla condizione indicata nella clausola where o elimina tutte le righe dalla tabella se non viene specificata alcuna condizione. Ma non libera lo spazio contenente la tabella.
La sintassi di un'istruzione DELETE SQL è:
DELETE FROM table_name [condizione WHERE];
Istruzione TRUNCATE: questo comando viene utilizzato per eliminare tutte le righe dalla tabella e liberare lo spazio contenente la tabella.
ELIMINA
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]
TRONCARE
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]
Per maggiori dettagli visita
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
In breve, troncare non registra nulla (quindi è molto più veloce ma non può essere annullato) mentre l'eliminazione è registrata (e può far parte di una transazione più grande, eseguirà il rollback ecc.). Se hai dati che non vuoi in una tabella in dev è normalmente meglio troncare poiché non corri il rischio di riempire il registro delle transazioni
Un grande motivo per cui è utile è quando è necessario aggiornare i dati in una tabella con più milioni di righe, ma non si desidera ricostruirla. "Elimina *" richiederebbe un'eternità, mentre l'impatto sulle prestazioni di Truncate sarebbe trascurabile.
Impossibile eseguire DDL su un doppio lampeggio.
Non è che tronca non registra nulla in SQL Server. truncate non registra alcuna informazione ma registra la deallocazione della pagina di dati per la tabella su cui è stato attivato TRUNCATE.
e il record troncato può essere il rollback se definiamo la transazione all'inizio e possiamo ripristinare il record troncato dopo il rollback. Ma non è possibile recuperare i record troncati dal backup del registro delle transazioni dopo la transazione troncata impegnata.
Truncate può anche essere eseguito il rollback qui dell'esapmle
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
Troncare ed eliminare in SQL sono due comandi utilizzati per rimuovere o eliminare i dati dalla tabella. Sebbene di natura abbastanza basilare, entrambi i comandi Sql possono creare molti problemi finché non si ha familiarità con i dettagli prima di usarli. Una scelta errata del comando può comportare un processo molto lento o addirittura l'espansione del segmento di registro, se è necessario rimuovere troppi dati e il segmento di registro non è sufficiente. Ecco perché è fondamentale sapere quando utilizzare il comando truncate ed delete in SQL, ma prima di utilizzarli dovresti essere consapevole delle differenze tra Truncate ed Delete e, in base a esse, dovremmo essere in grado di scoprire quando DELETE è l'opzione migliore per rimuovere dati o TRUNCATE devono essere usati per eliminare le tabelle.
Fare riferimento al controllo fare clic qui
Un'altra differenza specifica per Microsoft SQL Server è che delete
è possibile utilizzare l' output
istruzione per tenere traccia di quali record sono stati eliminati, ad esempio:
delete from [SomeTable]
output deleted.Id, deleted.Name
Non puoi farlo con truncate
.