17 messaggi dal 22 agosto 2007
Salve a tutti/e,
il fatto è il seguente:

Ho una tabella con 27000000 milioni di records, devo eseguire la delete su circa 12000000 di essi. Il problema è che la delete, a differenza della truncate, salva un sacco di roba nel log e così, dopo circa 4 ore, la query non è ancora completata, il log occupa quasi tutto lo spazio su disco e sql diventa lentissimo. Esiste un modo per eseguire una delete senza salvare tutte le info sul log!? (tanto in seguito non devo eseguire nessuna rollback) Oppure si può fare la truncate solo su una parte della tabella!?

grazie in anticipo,
Marco

PS: L' unica soluzione che ci è venuta in mente è copiare in una tab temporanea i dati da non cancellare, fare la truncate della tabella originale e poi ricopiare i dati dalla temporanea all' originale.
salve Marco,
kingmob ha scritto:
Salve a tutti/e,
il fatto è il seguente:

Ho una tabella con 27000000 milioni di records, devo eseguire la delete su circa 12000000 di essi. Il problema è che la delete, a differenza della truncate, salva un sacco di roba nel log e così, dopo circa 4 ore, la query non è ancora completata, il log occupa quasi tutto lo spazio su disco e sql diventa lentissimo. Esiste un modo per eseguire una delete senza salvare tutte le info sul log!? (tanto in seguito non devo eseguire nessuna rollback) Oppure si può fare la truncate solo su una parte della tabella!?

grazie in anticipo,
Marco

PS: L' unica soluzione che ci è venuta in mente è copiare in una tab temporanea i dati da non cancellare, fare la truncate della tabella originale e poi ricopiare i dati dalla temporanea all' originale.


non e' possibile non loggare le operazioni.. potresti pero' fare "blocchi" di operazioni piu' piccole..
invece di cancellare 12milioni di righe in una singola transazione, fai piu' transazioni da, che so, 50.000 righe per botta
metti il tutto in un bel ciclo, brutalmente simile a
DECLARE @top int;
SET @Top = 50000;
WHILE @@ROWCOUNT <> 0 BEGIN
BEGIN TRAN;
DELETE TOP (@Top) FROM tabella WHERE .....;
COMMIT TRANSACTION;
END;
o simile... puoi anche usare SET ROWCOUNT se non usi SQL Server 2005
quando @@ROWCOUNT sara' = 0 si uscira' automaticamente dal ciclo..
avendo transazioni piu' piccole, se il recovery del database e' simple, il transaction log potra' essere "riciclato".. se invece il recovery model non e' simple, allora comunque l'operazione sara' loggata e non verra' riciclato lo spazio del t-log..
l'utilizzo di memoria potrebbe essere anche inferiore, visto che invece di una mastodontica transazione ne avrai di piu' piccole, con rilasci di risorse ad ogni ciclo, tendenzialmente costante..
saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de
17 messaggi dal 22 agosto 2007
Grazie Mille! Ora abbiamo vari metodi per la delete. Vedremo qual'è più efficace nel nostro caso...

ciao da marco
Grazie Mille! Ora abbiamo vari metodi per la delete. Vedremo qual'è più efficace nel nostro caso...

valuta se possibile la possibilità di eliminare l'indice con (drop index) e quindi ricrearlo per velocizzare l'operazione

Christian Paparelli
http://www.ithost.ch
17 messaggi dal 22 agosto 2007
ciao. ho provato a fare la store procedure come mi hai detto. il problema è che la delete top è un comando di SQL 2005 ed il mio è + vecchio, altrimenti l'unico modo per farlo è quello di incapsulare una select top dentro la delete. Il problema di non salvare troppe cose sul log è comunque risolto, così però credo sia più lento...

grazie a tutti per le risposte

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC