Qual è la differenza tra TRUNCATE e DELETE in SQL
Domanda
Qual è la differenza tra TRUNCATE
e DELETE
in SQL?
Se la tua risposta è specifica della piattaforma, ti preghiamo di indicarlo.
Soluzione
Ecco un elenco di differenze. Ho messo in evidenza le funzionalità specifiche di Oracle e, si spera, la community può aggiungere anche la differenza specifica di altri fornitori. Le differenze comuni alla maggior parte dei fornitori possono andare direttamente sotto le intestazioni, con le differenze evidenziate di seguito.
Panoramica generale
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, probabilmente un TRUNCATE sarà più veloce di un ELIMINA.
Devono essere presi in considerazione vari problemi specifici del sistema, come spiegato di seguito.
Tipo di istruzione
Elimina è DML, Troncato è DDL ( Che cos'è DDL e DML? )
Commit and Rollback
Variabile per fornitore
SQL * Server
Il troncamento può essere ripristinato.
PostgreSQL
Il troncamento può essere ripristinato.
Oracle
Poiché un TRUNCATE è DDL, comporta due commit, uno prima e uno dopo l'esecuzione dell'istruzione. Pertanto, non è possibile eseguire il rollback di Truncate e un errore nel processo di troncamento avrà comunque eseguito un commit.
Tuttavia, vedi Flashback di seguito.
Bonifica dello spazio
Elimina non recupera spazio, Tronca recupera spazio
Oracle
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 di alta marea viene ripristinato.
Ambito di riga
Elimina può essere utilizzato per rimuovere tutte le righe o solo un sottoinsieme di righe. Troncare rimuove tutte le righe.
Oracle
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.
Tipi di oggetti
Elimina può essere applicato a tabelle e tabelle all'interno di un cluster. Troncare si applica solo alle tabelle o all'intero cluster. (Può essere specifico per Oracle)
Identità oggetto dati
Oracle
Elimina non influisce sull'ID oggetto dati, ma il troncamento assegna un nuovo ID oggetto dati a meno che non vi sia mai stato un inserimento contro la tabella dalla sua creazione Anche un singolo inserto che viene eseguito il rollback causerà un nuovo ID oggetto dati da assegnare al troncamento.
Flashback (Oracle)
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
Privilegi
Variabile
Oracle
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 sovvenzione DROP ANY TABLE.
Ripristina / Annulla
Elimina genera una piccola quantità di ripetizione e una grande quantità di annullamento. Troncare genera una quantità trascurabile di ciascuno.
Indici
Oracle
Un'operazione troncata rende nuovamente utilizzabili gli indici inutilizzabili. Elimina no.
Chiavi esterne
Un troncato non può essere applicato quando una chiave esterna abilitata fa riferimento alla tabella. Il trattamento con cancellazione dipende dalla configurazione delle chiavi esterne.
Blocco tabella
Oracle
Troncare richiede un blocco tabella esclusivo, l'eliminazione richiede un blocco tabella condiviso. Quindi disabilitare i blocchi di tabelle è un modo per impedire operazioni troncate su una tabella.
Trigger
I trigger DML non si attivano su un troncato.
Oracle
I trigger DDL sono disponibili.
Esecuzione remota
Oracle
Il troncamento non può essere emesso tramite un collegamento al database.
Colonne identità
SQL * Server
Troncare reimposta la sequenza per i tipi di colonna IDENTITY, l'eliminazione no.
Set di risultati
Nella maggior parte delle implementazioni, un'istruzione DELETE
può restituire al client le righe che sono state eliminate.
es. 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;
Altri suggerimenti
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) |
+----------------------------------------+----------------------------------------------+
GOCCIA
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.
TRUNCATE
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.
Elimina
Il comando DELETE è usato 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. Nota che questa operazione farà scattare tutti i trigger DELETE sul tavolo.
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 DDL ( Language Defination Data ) , non un DML ( Data Manipulation Langauge ), il comando Delete Triggers
non eseguire.
Riepilogo di Elimina V Troncato in SQL Server
Per l'articolo completo segui questo link: http: // codaffection .com / sql-server-article / delete-vs-troncato-in-sql server /
Tratto dall'articolo del mob dotnet: Elimina Vs Truncate in SQL Server
Con SQL Server o MySQL, se esiste un PK con incremento automatico, truncate ripristinerà il contatore.
" Truncate non registra nulla " è corretta. Andrei oltre:
Il troncamento non viene eseguito nel contesto di una transazione.
Il vantaggio di velocità del troncamento rispetto all'eliminazione dovrebbe essere evidente. 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.
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 di Oracle, AFAIK.
TRUNCATE
è l'istruzione DDL mentre DELETE
è un'istruzione DML. Di seguito sono riportate le differenze tra i due:
-
Poiché
TRUNCATE
è un DDL ( Lingua definizione dati ) 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 parteDELETE
è un DML ( Linguaggio di manipolazione dei dati ) quindi è necessario un impegno esplicito per rendere permanente il suo effetto. TRUNCATE
rimuove sempre tutte le righe da una tabella, lasciando la tabella vuota e la struttura della tabella intatta mentreDELETE
può rimuovere in modo condizionale se viene utilizzata la clausola where .-
Le righe eliminate dall'istruzione
TRUNCATE TABLE
non possono essere ripristinate e non è possibile specificare la clausola where nell'istruzioneTRUNCATE
.
Le istruzioni TRUNCATE
non attivano i trigger invece del trigger di eliminazione sull'istruzioneDELETE
Qui è l'ottimo link pertinente all'argomento.
Se accidentalmente hai rimosso tutti i dati dalla tabella usando Elimina / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristina l'ultimo backup ed esegui 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 conoscendo le differenze tra 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 le attività un trigger perché l'operazione viene registrata singolarmente.
- Più lento di Troncato perché mantiene i registri
Tronca
- 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 Troncare entrambi possono essere ripristinati quando utilizzati con Transazione. Se la transazione viene eseguita, significa impegnata, quindi non possiamo rollback Tronca il comando, ma possiamo ancora eseguire il rollback del comando Elimina dai file di registro, poiché delete write li registra nel file di registro in caso affermativo necessario eseguire il rollback in futuro dai file di registro.
Se hai un vincolo di chiave esterna che fa riferimento alla tabella che sei cercando di troncare, questo non funzionerà anche se la tabella di riferimento non ha dati in esso. Questo perché il controllo della chiave esterna viene eseguito con DDL piuttosto che DML. Questo può essere risolto disabilitando temporaneamente il file vincolo / i di chiave esterna alla tabella.
Elimina tabella è un'operazione registrata. Quindi viene eliminata ogni riga registrato nel registro delle transazioni, il che rende lento. Tronca tabella elimina anche tutte le righe in una tabella, ma non registrerà la cancellazione di ogni riga invece registra la deallocazione delle pagine di dati di tabella, che lo rende più veloce.
~ Se accidentalmente hai rimosso tutti i dati dalla tabella usando Cancellare / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristina il ultimo backup ed eseguire il registro delle transazioni fino al momento in cui Elimina / Tronca sta per succedere.
In SQL Server 2005 credo che puoi eseguire il rollback di un troncato
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 a conoscenza, quindi molto probabilmente considereranno la risposta sbagliata se dici loro che SI Truncate può essere ripristinato.
Elimina
Il comando DELETE è usato 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. Nota che questa operazione farà scattare tutti i trigger DELETE sul tavolo.
TRUNCATE
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.
GOCCIA
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
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 su la differenza tra DELETE e TRUNCATE in SQL Server
• Rimuovi dati : per prima cosa, entrambi possono essere utilizzati per rimuovere le righe dalla tabella.
Ma un DELETE può essere usato per rimuovere le righe non solo da una tabella ma anche da una VIEW o dal risultato di OPENROWSET o OPENQUERY in base alle funzionalità del provider.
• Clausola FROM : con DELETE puoi anche eliminare le righe da una tabella / view /owset_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à puoi 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 condizioni WHERE, 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.
• Rendimento : TRUNCATE TABLE è più veloce e utilizza meno risorse del sistema e del registro 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 una pulizia automatica o un'azione di registrazione quando le righe vengono eliminate.
• Colonna identità : con TRUNCATE se la tabella contiene una colonna identità, il contatore per quella colonna viene ripristinato 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 vuoi conservare il contatore di identità, usa invece DELETE.
• Replica : DELETE può essere utilizzato contro la 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 : è possibile eseguire il rollback dell'istruzione DELETE.
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.
La differenza più grande è che troncare è un'operazione non registrata mentre l'eliminazione è.
Semplicemente significa che in caso di arresto anomalo del database, non è possibile ripristinare i dati operati 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]
TRUNCATE
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 / cosa-è-il-differenza-tra-troncare-and-delete /
Un'ulteriore differenza delle due operazioni è che se la tabella contiene una colonna identità, il contatore per quella colonna viene resettato 1 (o al valore seed definito per la colonna) in TRUNCATE. DELETE non ha questo effetto.
In breve, il troncamento 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.
Vorrei commentare il post di matthieu, ma non ho ancora il rappresentante ...
In MySQL, il contatore di incremento automatico viene ripristinato con troncato, ma non con eliminazione.
Non è che troncato non registri 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 possono essere 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.
Troncare può anche essere ripristinato qui nell'esempio
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 fino a quando non si ha familiarità con i dettagli prima di usarlo. 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 dovrebbero essere usati per eliminare le tabelle.
Controlla controllo fai clic qui
Emettendo un'istruzione TRUNCATE TABLE, si indica a SQL Server di eliminare tutti i record all'interno di una tabella, senza che si verifichi alcuna registrazione o elaborazione delle transazioni.
L'istruzione DELETE può avere una clausola WHERE per eliminare record specifici mentre l'istruzione TRUNCATE non ne richiede alcuna e cancella l'intera tabella. È importante sottolineare che l'istruzione DELETE registra la data eliminata mentre l'istruzione TRUNCATE no.
Un'altra differenza specifica per microsoft sql server è con delete
è possibile utilizzare l'istruzione output
per tenere traccia di quali record sono stati eliminati, ad es .:
delete from [SomeTable]
output deleted.Id, deleted.Name
Non puoi farlo con troncare
.
Troncare viene utilizzato per reinizializzare la tabella, è un comando DDL che elimina tutte le righe della tabella.