La mejor manera de abordar esta pregunta es insertando los 4 millones de registros en una tabla. De hecho, puede colocarlos en una tabla con una columna de identidad mediante la "inserción masiva" en una vista.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Con todos los datos en la base de datos, ahora tiene muchas más opciones. Prueba la actualización:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
También debe crear un índice en TheIds(id)
.
Esta es una gran actualización, todas ejecutándose como una sola transacción. Eso puede tener implicaciones de mal rendimiento y comenzar a llenar el registro. Puede dividirlo en transacciones más pequeñas usando el rownum
columna:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
La cláusula existe aquí está haciendo el equivalente de la left outer join
. La principal diferencia es que esta sintaxis de subconsulta correlacionada debería funcionar en otras bases de datos, donde las uniones con actualizaciones son específicas de la base de datos.
Con el rownum
columna, puede seleccionar tantas filas como desee para la actualización. Por lo tanto, puede poner la actualización en un bucle, si la actualización general es demasiado grande:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
y así. No es necesario que haga esto, pero puede hacerlo si desea agrupar las actualizaciones por algún motivo.
La idea clave es obtener la lista de ID en una tabla en la base de datos, de modo que pueda usar el poder de la base de datos para las operaciones posteriores.