De beste manier om deze vraag te benaderen is door de 4 miljoen records in een tabel in te voegen. U kunt ze zelfs in een tabel met een identiteitskolom plaatsen door "bulk invoegen" in een weergave.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Met alle gegevens in de database heb je nu veel meer mogelijkheden. Probeer de update:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
U moet ook een index maken op TheIds(id)
.
Dit is een grote update, die allemaal als één transactie wordt uitgevoerd. Dat kan nadelige gevolgen hebben voor de prestaties en het logboek beginnen te vullen. U kunt het opsplitsen in kleinere transacties met behulp van het rownum
kolom:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
De bestaande clausule hier doet het equivalent van de left outer join
. Het grote verschil is dat deze gecorreleerde syntaxis voor subquery's zou moeten werken in andere databases, waar joins met updates databasespecifiek zijn.
Met het rownum
kolom, kunt u zoveel rijen selecteren als u wilt voor de update. U kunt de update dus in een lus plaatsen als de algehele update te groot is:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
enzovoort. U hoeft dit niet te doen, maar u kunt dit wel doen als u de updates om de een of andere reden wilt batchen.
Het belangrijkste idee is om de lijst met id's in een tabel in de database te krijgen, zodat u de kracht van de database kunt gebruiken voor de volgende bewerkingen.