2009-11-20 10 views
9

Abbiamo una tabella con oltre 150 milioni di record. Abbiamo bisogno di cancellare/cancellare tutte le righe. L'operazione di cancellazione impiegherebbe per sempre a causa della sua scrittura nei t-logs e non possiamo modificare il nostro modello di recupero per l'intero DB. Abbiamo testato l'opzione tabella troncata.Bulk delete (truncate vs delete)

Quello che ci siamo resi conto che troncare rilascia le pagine dalla tabella, e se non sbaglio le rendono disponibili per il riutilizzo ma non riducono automaticamente il db. Quindi, se vogliamo ridurre la dimensione del DB, avremmo davvero bisogno di eseguire il comando db shrink dopo aver troncato la tabella.

È questa procedura normale? Tutto ciò di cui abbiamo bisogno per essere attenti o consapevoli, o ci sono alternative migliori?

risposta

1

"eliminare tutte le righe" ... sarebbe non DROP TABLE (e ri-ricreare uno vuoto con lo stesso schema/indici) preferibile? (Personalmente mi piace "nuovo inizio" ;-))

Detto questo TRUNCATE TABLE è abbastanza OK, e sì, DBCC SHRINKFILE può essere richiesto in seguito se si desidera recuperare lo spazio.

0

Una cosa da ricordare con Truncate Table (così come drop table) sta andando avanti, questo non funzionerà se si hanno mai chiavi esterne che fanno riferimento alla tabella.

+0

su SQL Server, 'cadere table' non può essere utilizzato se ci sono vincoli di chiave esterna. http://msdn.microsoft.com/en-us/library/ms173790.aspx – ProKiner

+0

@prokiner hai avuto a che fare con riferimenti di chiavi straniere, non importa quale, cioè se la (e) riga (i) viene cancellata, ridotta o rilasciata, qualsiasi record in altre tabelle che fanno riferimento a questa o più righe devono essere eliminate prima o rimosso il vincolo. In alcuni casi questo può essere "automatizzato" con i trigger ON DELETE, ma questo è difficilmente applicabile a database di tipo 150+ Million. – mjv

+0

@prokiner, avrei dovuto essere più chiaro.Quelli erano pensati per essere due pensieri separati, stavo solo sottolineando la questione se l'OP avesse dichiarato di aver testato il metodo troncato. Ho ripulito la mia risposta. –

1

truncate è quello che stai cercando. Se è necessario ridurre il db in seguito, eseguire una contrazione.

Questo MSDN refernce (se stai parlando di T-SQL) confronta il dietro le quinte dell'eliminazione di righe rispetto al troncamento.

+0

Come altri commenti hanno notato, dovrai affrontare i tuoi vincoli di chiave esterna (se ce ne sono), indipendentemente dall'approccio scelto. La mia preferenza sarebbe quella di disabilitare i vincoli, 'troncare' la tabella, riabilitare i vincoli e quindi' dbcc shirinkfile' (concederti un po 'di tempo). – ProKiner

0

A seconda della dimensione del database completo, la riduzione può richiedere un po 'di tempo; Ho trovato che andare più veloce se è ridotto in blocchi più piccoli, piuttosto che cercare di riaverlo tutto in una volta.

0

Si dispone di una soluzione normale (truncate + shrink db) per rimuovere tutti i record da una tabella.

Come ha sottolineato Irwin. Il comando TRUNCATE non funzionerà mentre viene referenziato da un vincolo di chiave esterna. Quindi prima eliminare i vincoli, troncare la tabella e ricreare i vincoli.

Se il vostro preoccupati prestazionie questa è una routine regolare per il sistema. Potrebbe essere utile esaminare spostando questa tabella nel proprio file di dati, quindi eseguire solo per il file di dati di destinazione.

0

Come sottolineato, se non è possibile utilizzare troncare o far cadere

SELECT 1 
WHILE @@ROWCOUNT <> 0 
    DELETE TOP (100000) MyTable 
+0

Può usare sia truncate sia drop, tuttavia sono possibili considerazioni con qualsiasi operazione (cancellazione, rilascio, troncamento) che dovrà essere gestita. – Chad