Nejlepší způsob, jak přistoupit k tomuto požadavku, je vložit 4 miliony záznamů do tabulky. Ve skutečnosti je můžete vložit do tabulky se sloupcem identity „hromadným vložením“ do pohledu.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Se všemi údaji v databázi máte nyní mnohem více možností. Zkuste aktualizaci:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Měli byste také vytvořit index na TheIds(id)
.
Toto je rozsáhlá aktualizace, vše se provádí jako jedna transakce. To může mít dopad na špatný výkon a začít vyplňovat protokol. Můžete jej rozdělit na menší transakce pomocí rownum
sloupec:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
Klauzule exists zde dělá ekvivalent left outer join
. Hlavním rozdílem je, že tato korelovaná syntaxe poddotazu by měla fungovat v jiných databázích, kde jsou spojení s aktualizacemi specifická pro databázi.
Pomocí rownum
můžete pro aktualizaci vybrat tolik řádků, kolik chcete. Pokud je tedy celková aktualizace příliš velká, můžete aktualizaci uvést do smyčky:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
a tak dále. Nemusíte to dělat, ale můžete, pokud z nějakého důvodu chcete aktualizace dávkovat.
Klíčovou myšlenkou je dostat seznam id do tabulky v databázi, abyste mohli využít sílu databáze pro následné operace.