Bardzo często zdarza się, że trzeba dokonać zmian na wielu milionach rekordów. Wykonując update czy delete na takiej ilości rekordów w ramach jednej transakcji doprowadzamy do sytuacji rozrostu loga transakcyjnego.

Oczywiście jeżeli byśmy takie operacje wykonywali małymi porcjami to powstało by dużo transakcji i po zakończeniu każdej z nich silnik sql serwera wstawiał by ponownie dane do loga transakcyjnego wykorzystując już zwolnione miejsca (Recovery model = SIMPLE)

Poniżej przedstawiam przykładowy kod:


use Foo
go

declare @i int =1
declare @x int=0
set rowcount 50000; -- będzie wykonywał update tylko na 50000 rekordów

while @i>0

begin 
 UPDATE Foo.dbo.Tabela
 SET  kolumna = wartosc
 WHERE {predykat}
    set @i=@@ROWCOUNT
    set @x=@x+@i
  end
set rowcount 0 




Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl