Modo più veloce per cancellare tutti i dati in una tabella di grandi dimensioni

StackOverflow https://stackoverflow.com/questions/64117

  •  09-06-2019
  •  | 
  •  

Domanda

Ho dovuto cancellare tutte le righe di una tabella di log che conteneva circa 5 milioni di righe.La mia prima prova è stato quello di emettere il seguente comando in query analyzer:

elimina dal client_log

che ha avuto un tempo molto lungo.

È stato utile?

Soluzione

Check out truncate table che è molto più veloce.

Altri suggerimenti

Ho scoperto il TRUNCATE TABLE in msdn transact-SQL di riferimento.Per tutti gli interessati ecco il commento:

TRUNCATE TABLE è funzionalmente identico a ELIMINARE dichiarazione con la clausola WHERE:rimuovere tutte le righe della tabella.Ma TRUNCATE TABLE è più veloce e utilizza meno di registro delle transazioni e delle risorse di ELIMINARE.

L'istruzione DELETE rimuove le righe, uno alla volta, e registra una voce nel log delle transazioni per ogni riga eliminata.TRUNCATE TABLE rimuove i dati deallocazione le pagine di dati utilizzata per memorizzare i dati della tabella, e solo la pagina deallocazioni vengono registrati nel log delle transazioni.

TRUNCATE TABLE rimuove tutte le righe da una tabella, ma la struttura della tabella e le colonne, i vincoli, indici e così via.Il contatore utilizzato da un'identità per le nuove righe di reset per il seme per la colonna.Se si desidera mantenere l'identità del contatore, utilizzare l'istruzione DELETE.Se si desidera rimuovere definizione della tabella e i relativi dati, utilizzare l'istruzione DROP TABLE.

Non è possibile utilizzare TRUNCATE TABLE su una tabella a cui fa riferimento un vincolo di CHIAVE esterna;invece, utilizzare l'istruzione DELETE senza una clausola WHERE.Perché TRUNCATE TABLE non è connesso, è possibile attivare un trigger.

TRUNCATE TABLE non possono essere utilizzati su tabelle che partecipano a una vista indicizzata.

C'è un mito comune che TRONCANO in qualche modo salta il log delle transazioni.

Questo è un equivoco, ed è chiaramente menzionato nella MSDN.

Questo mito viene richiamato in diversi commenti qui.Andiamo a sradicare insieme ;)

Per riferimento TRUNCATE TABLE funziona anche su MySQL

dimenticate di troncare e di eliminare.mantenere il vostro definizioni della tabella (nel caso in cui si desidera ricreare) e basta usare drop table.

Io uso il seguente metodo per azzerare le tabelle, con l'aggiunta di bonus che mi lascia con una copia di archivio della tabella.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;

truncate table è non SQL-indipendente dalla piattaforma.Se si sospetta che si potrebbe mai cambiare provider di database, si potrebbe diffidare di utilizzo.

Su SQL Server, è possibile utilizzare il Truncate Table comando che è più veloce di un normale eliminare e utilizza meno risorse.Azzera qualsiasi identità campi per il seme di valore.

Gli svantaggi di troncare sono che non può essere utilizzato su tabelle che fanno riferimento chiavi esterne e non il fuoco di tutti i trigger.Inoltre, non sarà in grado di eseguire il rollback di dati se qualcosa va storto.

Nota che TRONCANO anche reset alcun incremento automatico delle chiavi, se si utilizzano questi.

Se non volete perdere la vostra auto incremento di tasti, è possibile accelerare l'eliminazione dalla cancellazione di imposta (ad esempio, DELETE FROM tabella WHERE id > 1 E id < 10000).Sarà accelerare in modo significativo e, in alcuni casi, evitare che i dati vengano bloccati.

Sì, beh, l'eliminazione di 5 milioni di righe è probabilmente andando a prendere un lungo periodo di tempo.Il solo potenzialmente più veloce il modo in cui ho pensato di eliminare la tabella, e ri-creare.Che funziona solo, naturalmente, se si desidera eliminare TUTTI i dati nella tabella.

truncate table client_log

è la vostra scommessa migliore, troncare uccide tutto il contenuto della tabella e indici e ripristina tutti i semi che hai avuto troppo.

Il suggerimento di "eliminare e ricreare la tabella" probabilmente non è una buona causa che goofs fino tuo chiavi esterne.

Si utilizza chiavi esterne, giusto?

Se non è possibile utilizzare l'istruzione TRUNCATE TABLE a causa di chiavi esterne e/o trigger, si può prendere in considerazione di:

  • rimuovere tutti gli indici;
  • fare la solita ELIMINARE;
  • ricreare tutti gli indici.

In questo modo la velocità di ELIMINARE un po'.

Sto rivedendo la mia precedente affermazione:

Si dovrebbe capire che utilizzando TRONCARE i dati saranno cancellati, ma nulla sarà registrato log delle transazioni.Iscritto al registro è perché ELIMINA avrà per sempre il 5 milioni di righe.Io uso spesso TRONCA durante lo sviluppo, ma si dovrebbe essere cauti nell'usare su una produzione database perché non sarà in grado per annullare le modifiche apportate.Si dovrebbe immediatamente fare un completo database backup dopo aver fatto un TRONCAMENTO stabilire una nuova base per restauro.

La dichiarazione di cui sopra è stato inteso la richiesta, per essere sicuri di capire che c'è differenza tra i due.Purtroppo, non è scritto male e rende istruzioni non supportate come non ho fatto alcun test me tra i due.Esso si basa su dichiarazioni che ho sentito da altri.

Da MSDN:

L'istruzione DELETE rimuove le righe una a tempo di record e di una voce log delle transazioni per ogni riga eliminata.TRUNCATE TABLE rimuove i dati da deallocazione le pagine di dati utilizzati per memorizzare i dati della tabella, e solo il pagina deallocazioni sono registrati nel log delle transazioni.

Volevo solo dire che c'è una differenza fondamentale tra i due e perché c'è una differenza, ci saranno le applicazioni in cui l'uno o l'altro può essere inappropriato.

DELETE * FROM table_name;

Prematura di ottimizzazione può essere pericoloso.L'ottimizzazione può significare fare qualcosa di strano, ma se funziona si consiglia di prendere vantaggio di esso.

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

Per la velocità penso che dipende da...

  • Il database sottostante:Oracle, Microsoft, MySQL, PostgreSQL, altri, personalizzato...

  • La tabella, è il contenuto, e le relative tabelle:

Ci possono essere regole di eliminazione.C'è una procedura esistente per eliminare tutto il contenuto della tabella?Questo può essere ottimizzato per le specifiche motore di database sottostante?Quanto ci preoccupiamo di rompere le cose e relativi dati?L'esecuzione di un'ELIMINAZIONE può essere sicuro modo assumendo che le altre tabelle correlate non dipende da questa tabella.Ci sono altre tabelle e le query correlate / dipende i dati all'interno di questa tabella?Se non ci si cura più di tanto su questo tavolo sta intorno, con DROP potrebbe essere un metodo veloce, di nuovo, a seconda del database sottostante.

DROP TABLE table_name;

Quante righe vengono cancellati?C'è altre informazioni che è scoperto che consentirà di ottimizzare l'eliminazione?Per esempio, possiamo sapere se la tabella è vuota?Possiamo dire se ci sono centinaia, migliaia, milioni, miliardi di righe?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top