Bulk DELETE su SQL Server 2008 (Esiste qualcosa come Bulk Copy (bcp) per eliminare i dati?)

C’è qualche soluzione per l’eliminazione di massa in SQL Server?

Non riesco a utilizzare TRUNCATE perché voglio utilizzare WHERE per limitare le righe in azione.

C’è qualcosa come Bulk Copy (bcp) per cancellare i dati?

No.

Vuoi un DELETE con una clausola WHERE: questo è SQL standard.

Quello che puoi fare è eliminare il batch in questo modo:

SELECT 'Starting' --sets @@ROWCOUNT WHILE @@ROWCOUNT <> 0 DELETE TOP (xxx) MyTable WHERE ... 

O se vuoi rimuovere una percentuale molto alta di righe …

 SELECT col1, col2, ... INTO #Holdingtable FROM MyTable WHERE ..opposite condition.. TRUNCATE TABLE MyTable INSERT MyTable (col1, col2, ...) SELECT col1, col2, ... FROM #Holdingtable 

Puoi fare un paio di cose se vuoi cancellare parte della tua tabella e non TRUNCATE .

puoi selezionare una parte del tavolo in una nuova tabella, quindi cambiare i due, in questo modo:

 SELECT * INTO tmp_MyTable FROM MyTable WHERE Key='Value' IF @@ROWCOUNT > 0 BEGIN EXEC sp_rename MyTable, old_MyTable, NULL EXEC sp_rename tmp_MyTable, MyTable, NULL TRUNCATE old_MyTable END 

In secondo luogo, se stai usando il partizionamento, puoi creare una tabella identica (vuota) sullo stesso schema di partizione .. e se la tabella è partizionata in base alla logica di archiviazione / eliminazione, puoi spostare un blocco di partizione dalla tabella principale a la nuova tabella e quindi troncare la nuova tabella .. Ad esempio:

 ALTER TABLE MyTable SWITCH PARTITION 15 TO purge_MyTable PARTITION 2 GO; TRUNCATE TABLE purge_MyTable 

Ps. Le partizioni sono disponibili in SQL 2005/08 Ent.

Spero che questo ti aiuti!

Sychare Jedko,

Il vantaggio di TRUNCATE è di evitare la registrazione di ogni singola eliminazione nel file di registro. un’istruzione TRUNCATE creerà una singola voce (nel registro) per l’intero batch.

Ho appena trovato un problema simile su una tabella di gestione temporanea che presentava problemi di ridimensionamento con blocchi appropriati.

Poiché per noi la tabella pertinente è riferita solo in una posizione, abbiamo semplicemente sostituito tale riferimento con una query per il nome della tabella dynamic, che viene creato con un “select into” simile a quanto suggerito da gbn.

Ciò è gestibile in quanto la tabella di staging viene solo referenziata in un posto nel codice e la spesa della chiamata di database aggiuntiva insieme alla creazione della tabella è giustificata in un contesto di magazzino. Se hai solo poche centinaia di record o fai riferimento alla tabella nel tuo codice numerose volte, allora questo approccio potrebbe non funzionare.

Quando gestisco milioni di righe, preferisco avere un’istruzione WHERE e utilizzare SELECT INTO in una tabella di copia, eliminare la tabella originale e rinominare la copia (torna al nome originale).

Però, dovresti avere in mente cose come (FK), i vincoli, ecc. Ma con questo metodo si evita il badazz-size del log e si evita un enorme consumo di tempo dell’eliminazione in blocchi.

/ Snedker

controllare questo

  1. articolo da MSDN Delete_a_Huge_Amount_of_Data_from
  2. Informazioni sui modelli di recupero
  3. e visualizzare o modificare il modello di recupero di un database