Der beste Weg, diese Frage anzugehen, besteht darin, die 4 Millionen Datensätze in eine Tabelle einzufügen. Tatsächlich können Sie sie durch "Masseneinfügen" in eine Ansicht in eine Tabelle mit einer Identitätsspalte einfügen.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Mit all den Daten in der Datenbank haben Sie jetzt viel mehr Möglichkeiten. Versuchen Sie das Update:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Sie sollten auch einen Index für TheIds(id)
erstellen .
Dies ist eine große Aktualisierung, die alle als eine Transaktion ausgeführt werden. Das kann negative Auswirkungen auf die Leistung haben und anfangen, das Protokoll zu füllen. Sie können es mit rownum
in kleinere Transaktionen aufteilen Spalte:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
Die Existiert-Klausel hier macht das Äquivalent zum left outer join
. Der Hauptunterschied besteht darin, dass diese korrelierte Unterabfragesyntax in anderen Datenbanken funktionieren sollte, in denen Verknüpfungen mit Aktualisierungen datenbankspezifisch sind.
Mit der rownum
Spalte können Sie beliebig viele Zeilen für die Aktualisierung auswählen. So können Sie das Update in eine Schleife stecken, wenn das Gesamtupdate zu groß ist:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
usw. Sie müssen dies nicht tun, aber Sie können die Aktualisierungen aus irgendeinem Grund bündeln.
Die Schlüsselidee besteht darin, die Liste der IDs in eine Tabelle in der Datenbank zu bekommen, damit Sie die Leistungsfähigkeit der Datenbank für die nachfolgenden Operationen nutzen können.