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