Cara terbaik untuk mendekati permintaan ini adalah dengan memasukkan 4 juta catatan ke dalam tabel. Bahkan, Anda dapat menempatkannya ke dalam tabel dengan kolom identitas, dengan "menyisipkan secara massal" ke dalam tampilan.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
Dengan semua data dalam database, Anda sekarang memiliki lebih banyak pilihan. Coba pembaruan:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Anda juga harus membuat indeks di TheIds(id)
.
Ini adalah pembaruan besar, semua dieksekusi sebagai satu transaksi. Itu dapat memiliki implikasi kinerja yang buruk dan mulai mengisi log. Anda dapat memecahnya menjadi transaksi yang lebih kecil menggunakan rownum
kolom:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
Klausa yang ada di sini melakukan hal yang setara dengan left outer join
. Perbedaan utama adalah bahwa sintaks subquery yang berkorelasi ini harus bekerja di database lain, di mana gabungan dengan pembaruan adalah khusus database.
Dengan rownum
kolom, Anda dapat memilih baris sebanyak yang Anda inginkan untuk pembaruan. Jadi, Anda dapat menempatkan pembaruan dalam satu lingkaran, jika pembaruan keseluruhan terlalu besar:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
dan seterusnya. Anda tidak perlu melakukan ini, tetapi Anda dapat melakukannya jika ingin mengelompokkan pembaruan karena alasan tertentu.
Ide utamanya adalah memasukkan daftar id ke dalam tabel di database, sehingga Anda dapat menggunakan kekuatan database untuk operasi selanjutnya.