Najlepszym sposobem rozwiązania tego pytania jest wstawienie 4 milionów rekordów do tabeli. W rzeczywistości możesz umieścić je w tabeli z kolumną tożsamości, „wstawiając zbiorczo” do widoku.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Mając wszystkie dane w bazie danych, masz teraz o wiele więcej opcji. Wypróbuj aktualizację:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Powinieneś także utworzyć indeks na TheIds(id)
.
Jest to duża aktualizacja, wszystkie wykonywane jako jedna transakcja. Może to mieć zły wpływ na wydajność i zacząć zapełniać dziennik. Możesz podzielić go na mniejsze transakcje za pomocą rownum
kolumna:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
Klauzula exist tutaj wykonuje odpowiednik left outer join
. Główną różnicą jest to, że ta skorelowana składnia podzapytania powinna działać w innych bazach danych, gdzie łączenia z aktualizacjami są specyficzne dla bazy danych.
Z rownum
kolumna, możesz wybrać dowolną liczbę wierszy do aktualizacji. Możesz więc umieścić aktualizację w pętli, jeśli ogólna aktualizacja jest zbyt duża:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
i tak dalej. Nie musisz tego robić, ale możesz, jeśli z jakiegoś powodu chcesz grupować aktualizacje.
Kluczową ideą jest umieszczenie listy identyfikatorów w tabeli w bazie danych, dzięki czemu można wykorzystać moc bazy danych do kolejnych operacji.