2010-07-15 18 views
49

qualcuno potrebbe darmi una rapida panoramica dei pro e dei contro di utilizzare le due istruzioni seguenti:Pro & Contro di TRUNCATE vs DELETE FROM

TRUNCATE TABLE dbo.MyTable 

vs

DELETE FROM dbo.MyTable 

Sembra che sia fare la stessa cosa quando tutto è detto e fatto; ma ci devono essere differenze tra i due.

risposta

70

TRUNCATE non genera alcun dato di ripristino, il che lo rende velocissimo. Semplicemente rilascia le pagine di dati usate dalla tabella.

Tuttavia, se si è in una transazione e si desidera la possibilità di "annullare" questa eliminazione, è necessario utilizzare DELETE FROM, che consente di eseguire il rollback.

MODIFICA: Si noti che quanto sopra non è corretto per SQL Server (ma vale per Oracle). In SQL Server, è possibile eseguire il rollback di un'operazione troncata se ci si trova all'interno di una transazione e la transazione non è stata eseguita. Da una prospettiva di SQL Server, una differenza chiave tra DELETE FROM e TRUNCATE è this: "L'istruzione DELETE rimuove le righe una alla volta e registra una voce nel log delle transazioni per ciascuna riga eliminata. TRUNCATE TABLE rimuove i dati deallanciando i dati pagine utilizzate per memorizzare i dati della tabella e registra solo le deallocazioni della pagina nel log delle transazioni. "

In altre parole, durante il TRUNCATE è presente un numero inferiore di registrazioni poiché solo le deallocazioni di pagina vengono registrate nel registro delle transazioni, mentre con DELETE FROM ogni riga viene registrata l'eliminazione. Questo è uno dei motivi per cui TRUNCATE è fulmineo.

Nota anche da quel collegamento MSDN che non è possibile troncare le tabelle a cui fanno riferimento i vincoli di chiave esterna, partecipare a una vista indicizzata o vengono pubblicati utilizzando la replica transazionale o la replica di tipo merge.

EDIT 2: Un altro punto chiave è che TRUNCATE TABLE ripristinerà la vostra identità al seme iniziale, mentre DELETE FROM porterà avanti incremento dal punto in cui era stato interrotto. Riferimento: risposta di Ben Robinson.

+3

'TRUNCATE' può anche rompere consistenza (= non verificare la presenza di chiavi esterne, e non sparare trigger) – nothrow

+13

@Yossarian - Secondo MSDN: "Non è possibile utilizzare TRUNCATE TABLE su una tabella a cui fa riferimento un vincolo FOREIGN KEY; invece, utilizzare l'istruzione DELETE senza una clausola WHERE ". http://msdn.microsoft.com/en-us/library/aa260621%28SQL.80%29.aspx – dcp

+4

truncate può essere eseguito il rollback di alos. http: // sqlblog.it/blogs/denis_gobo/archive/2007/06/13/1458.aspx – Dhananjay

-2

troncare doesnt fare qualsiasi registrazione, eliminare lo fa, quindi se avete una tonnellata di record, il registro trans è enorme

4

TRUNCATE TABLE non registra la transazione. Ciò significa che è un fulmine veloce per i tavoli di grandi dimensioni. Lo svantaggio è che non è possibile annullare l'operazione.

DELETE FROM registra ogni riga che viene eliminata nei registri delle transazioni in modo che l'operazione richieda un po 'di tempo e causi un aumento notevole dei log delle transazioni. Il lato positivo è che è possibile annullare l'operazione se necessario.

+2

TRUNCATE è registrato e può essere annullato proprio come DELETE - utilizzando ROLLBACK o RESTORE. – sqlvogel

+1

solo se si utilizzano le transazioni e se il troncato è impegnato, non è possibile eseguire il rollback. è DDL e non viene registrato nel file di registro. – ScaleOvenStove

+1

È interessante notare che sia questa risposta sia quella contrassegnata come risposta dicono quasi la stessa cosa, ma questa è stata convertita in down a -1 mentre quella segnata come risposta è stata aumentata a +7 (almeno nel momento in cui sto scrivendo questo). Come notato in precedenza da @dcp, [this] (http: //blog.sqlauthority.it/2007/12/26/sql-server-truncate-può-essere-roll-back-using-log-files-after-transaction-session-is-closed /) è un buon articolo che descrive il comportamento di rollback di TRUNCATE vs DELETE. –

43

Un altro punto chiave non menzionato nelle altre risposte è che TRUNCATE TABLE sarà ripristinare tua identità al seme iniziale, mentre DELETE FROM porterà sulla incremento dal punto in cui era stato interrotto.

1

La differenza fondamentale è nel modo in cui sono registrati. DELETE e TRUNCATE vengono registrati in modo diverso, ma entrambi possono essere ripristinati esattamente allo stesso modo. Tutte le operazioni che modificano i dati vengono registrate.In SQL Server non esiste un'operazione non registrata.

2

Credo che Delete and Truncate può essere ripristinato solo se l'operazione è stata eseguita in e transazione esplicita. Altrimenti dovresti eseguire un ripristino per recuperare i dati rimossi

7

Un'altra differenza dal punto di vista della sicurezza è che TRUNCATE richiede i privilegi ALTER sulla tabella, mentre DELETE richiede semplicemente (rullo di tamburi) autorizzazioni DELETE su tale tabella.

-1
$connection = $this->getEntityManager()->getConnection(); 
$connection->exec("Truncate TABLE <tablename>;"); 
+0

Potresti aggiungere un po 'di contesto a questo codice. – ppperry

0

Una cosa che è molto importante (IMO) e non è menzionato sul altre risposte è che TRUNCATE ha bisogno dello schema di blocco di stabilità, Sch-S, mentre DELETE utilizza blocchi di riga. Consente di ispezionare il seguente:

BEGIN TRANSACTION; 

BEGIN TRY 
    -- Truncate below will take LCK_M_SCH_S lock for TABLE_A 
    TRUNCATE TABLE TABLE_A 

    -- Lets say the query below takes 5 hours to execute 
    INSERT INTO 
     TABLE_A 
    SELECT 
     * 
    FROM 
     GIANT_TABLE (NOLOCK) 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
    THROW 
END CATCH 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION; 

Ora supporre che dopo 1-2 minuti dall'inizio di questa query, diciamo che abbiamo cercato di eseguire il seguente:

SELECT COUNT(*) FROM TABLE_A (NOLOCK) 

Si noti che ho usato NOLOCK clausola. Cosa pensi che succederà ora? Questa query attenderà 5 ore. Perché? Perché la clausola NOLOCK necessita del blocco Sch-S su TABLE_A ma quella clausola TRUNCATE dispone già di Sch-S. Poiché non abbiamo ancora eseguito il commit della transazione, il blocco è ancora attivo anche dopo la clausola TRUNCATE. Sch-S il blocco su una tabella significa sostanzialmente che TABLE_A viene modificato aggiungendo/rimuovendo colonne ecc. O viene troncato. Non è nemmeno possibile eseguire qualcosa di simile al seguente:

SELECT object_id('TABLE_A') 

Ciò sarà bloccato anche per 5 ore. Tuttavia, se sostituisci lo TRUNCATE con DELETE FROM, vedrai che non ci sarà il blocco Sch-S sul tavolo e le query sopra non verranno bloccate.

0

Un'altra differenza tra DELETE rispetto a TRUNCATE è il comportamento quando la tabella è danneggiata.

Per esempio:

DELETE FROM table_name; 

finirà con l'errore:

Msg 3314, Level 21, State 3, Line 1

During undoing of a logged operation in database '...', an error occurred at log record ID(). Typically, the specific failure is logged previously as an error in the Windows Event Log service. Restore the database or file from a backup, or repair the database.

Msg 0, Level 20, State 0, Line 0

A severe error occurred on the current command. The results, if any, should be discarded.

Mentre TRUNCATE funzionerà:

TRUNCATE TABLE table_name; 
-- Command(s) completed successfully. 
1

Schema di Delete Vs Tronca in SQL Server

Per articolo completo prendere dopo questa connessione: Delete Vs Truncate in SQL Server

enter image description here

/*Truncate - Syntax*/ 
TRUNCATE TABLE table_name 

/*Delete - Syntax*/ 
DELETE FROM table_name 
WHERE some_condition