Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso eliminare i dati scaduti da una tabella enorme senza che il file di registro cresca fuori controllo?

L'ho trovato utile quando si eliminano dalla tabella con un numero elevato di righe per eliminare le righe in batch di circa 5000 (di solito provo per vedere quale valore funziona più velocemente, a volte sono 5000 righe, a volte 10.000, ecc.) . Ciò consente di completare rapidamente ciascuna operazione di eliminazione, anziché attendere molto tempo prima che un'istruzione elimini 400 milioni di record.

In SQL Server 2005, qualcosa del genere dovrebbe funzionare (verifica prima, ovviamente):

WHILE EXISTS ( SELECT * FROM giganticTable WHERE exp_date < getDate())
BEGIN
  DELETE TOP(5000) FROM giganticTable WHERE exp_date < getDate()
END

Vedrei cosa fa l'eliminazione in batch alla dimensione del file di registro. Se sta ancora facendo esplodere i log, puoi provare a cambiare il modello di ripristino in Semplice , eliminando i record e quindi tornando a Bulk Logged, ma solo se il sistema è in grado di tollerare la perdita di alcuni dati recenti. Farei sicuramente un backup completo prima di tentare quella procedura. Questo thread suggerisce anche di impostare un processo per eseguire il backup dei registri con tronca solo specificato, quindi potrebbe essere un'altra opzione. Si spera che tu abbia un'istanza con cui puoi testare, ma inizierei con le eliminazioni in batch per vedere come ciò influisca sulle prestazioni e sulla dimensione del file di registro.