La meilleure façon d'aborder cette question est d'insérer les 4 millions d'enregistrements dans une table. En fait, vous pouvez les mettre dans une table avec une colonne d'identité, en "insérant en masse" dans une vue.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Avec toutes les données de la base de données, vous avez maintenant beaucoup plus d'options. Essayez la mise à jour :
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Vous devez également créer un index sur TheIds(id)
.
Il s'agit d'une mise à jour importante, qui s'exécute en une seule transaction. Cela peut avoir de mauvaises implications sur les performances et commencer à remplir le journal. Vous pouvez le diviser en transactions plus petites en utilisant le rownum
colonne :
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
La clause exists ici fait l'équivalent de la left outer join
. La principale différence est que cette syntaxe de sous-requête corrélée devrait fonctionner dans d'autres bases de données, où les jointures avec les mises à jour sont spécifiques à la base de données.
Avec le rownum
colonne, vous pouvez sélectionner autant de lignes que vous le souhaitez pour la mise à jour. Ainsi, vous pouvez mettre la mise à jour en boucle, si la mise à jour globale est trop importante :
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
etc. Vous n'êtes pas obligé de le faire, mais vous pouvez si vous souhaitez regrouper les mises à jour pour une raison quelconque.
L'idée clé est d'obtenir la liste des identifiants dans une table de la base de données, afin que vous puissiez utiliser la puissance de la base de données pour les opérations ultérieures.