2009-07-10 16 views
56

Normalmente farei uno delete * from XXX ma su questa tabella è molto lento, ha normalmente da 500k a 1m di righe (uno è un varbinary (MAX) se questo tipo di mather).Elimina tutte le righe nella tabella

Fondamentalmente im chiedevo se esiste un modo rapido per emty tavolo di tutti i contenuti, la sua actualy più veloce da eliminare e ricreare poi per cancellare il contenuto tramite l'istruzione SQL delete

La ragione io non voglio ricreare la tabella è perché è pesantemente usata e cancella/ricrea io presumo distruggerà gli indici e le statistiche raccolte dal server sql

Im anche sperando che ci sia un modo per farlo perché c'è un modo "intelligente" per ottenere il conteggio delle righe tramite sys .sysindexes, quindi spero ci sia un modo equo intelligente per eliminare il contenuto

risposta

74

Truncate table è più veloce di delete * from XXX. Delete è lento perché funziona una riga alla volta. Ci sono alcune situazioni in cui il troncato non funziona, che puoi leggere su MSDN.

+12

questo ha anche l'effetto di non aggiungere le righe cancellate al log delle transazioni. Quindi, non può essere ripristinato, ma anche non sprecherà un sacco di spazio su disco –

11

Io suggerirei di usare TRUNCATE TABLE, è più veloce e usa meno risorse di DELETE FROM xxx

Ecco il relativo MSDN article

21

come altri hanno detto, TRUNCATE TABLE è molto più veloce, ma ha alcune restrizioni (prese da here):

Non è possibile utilizzare TRUNCATE TABLE su tabelle che:

- Sono referenziate da un vincolo FOREIGN KEY. (È possibile troncare una tabella con una chiave esterna che fa riferimento a se stessa.)
- Partecipare a una vista indicizzata.
- Vengono pubblicati utilizzando la replica transazionale o la replica di tipo merge.

Per le tabelle con una o più di queste caratteristiche, utilizzare invece l'istruzione DELETE.

Il più grande svantaggio è che se la tabella che si sta tentando di svuotare ha chiavi esterne che puntano ad essa, la chiamata troncata avrà esito negativo.

+0

, Eccezionale Spiegazione. +1 per Truncate –

12

È possibile rinominare la tabella in questione, creare una tabella con uno schema identico e quindi rilasciare la tabella originale a proprio piacimento.

Vedere il manuale di riferimento MySQL 5.1 per i comandi [RENAME TABLE] [1] e [CREATE TABLE] [2].

RENAME TABLE tbl TO tbl_old; 

CREATE TABLE tbl LIKE tbl_old; 

DROP TABLE tbl_old; -- at your leisure 

Questo approccio consente di ridurre al minimo i tempi di inattività dell'applicazione.

Problemi correlati