Il modo migliore per affrontare questa richiesta è inserire i 4 milioni di record in una tabella. In effetti, puoi inserirli in una tabella con una colonna identità, "inserendo in blocco" in 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 tutti i dati nel database, ora hai molte più opzioni. Prova l'aggiornamento:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Dovresti anche creare un indice su TheIds(id)
.
Questo è un aggiornamento di grandi dimensioni, tutto in esecuzione come un'unica transazione. Ciò può avere implicazioni negative sulle prestazioni e iniziare a riempire il registro. Puoi suddividerlo in transazioni più piccole utilizzando il rownum
colonna:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
La clausola esiste qui sta facendo l'equivalente del left outer join
. La differenza principale è che questa sintassi di sottoquery correlata dovrebbe funzionare in altri database, dove i join con gli aggiornamenti sono specifici del database.
Con il rownum
colonna, puoi selezionare tutte le righe che desideri per l'aggiornamento. Quindi, puoi mettere l'aggiornamento in un ciclo, se l'aggiornamento generale è troppo grande:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
e così via. Non devi farlo, ma puoi farlo se vuoi raggruppare gli aggiornamenti per qualche motivo.
L'idea chiave è inserire l'elenco degli ID in una tabella nel database, in modo da poter utilizzare la potenza del database per le operazioni successive.