Saya akan menggunakan ROWID:
UPDATE xyz SET x='Y' WHERE rowid IN (
SELECT r FROM (
SELECT ROWID r FROM xyz ORDER BY dbms_random.value
) RNDM WHERE rownum < n+1
)
Alasan sebenarnya saya akan menggunakan ROWID bukan untuk efisiensi (itu masih akan melakukan pemindaian tabel penuh) - SQL Anda mungkin tidak memperbarui jumlah baris yang Anda inginkan jika kolom m
tidak unik.
Dengan hanya 1000 baris, Anda tidak perlu khawatir tentang efisiensi (mungkin dengan seratus juta baris). Tanpa indeks apa pun di tabel ini, Anda harus melakukan pemindaian tabel lengkap untuk memilih catatan acak.
[EDIT:] "Tapi bagaimana jika ada 100.000 baris"
Yah, itu masih 3 kali lipat kurang dari 100 juta.
Saya menjalankan yang berikut ini:
create table xyz as select * from all_objects;
[membuat sekitar 50.000 baris di sistem saya - tidak diindeks, seperti tabel Anda]
UPDATE xyz SET owner='Y' WHERE rowid IN (
SELECT r FROM (
SELECT ROWID r FROM xyz ORDER BY dbms_random.value
) RNDM WHERE rownum < 10000
);
commit;
Ini memakan waktu sekitar 1,5 detik. Mungkin 1 detik, mungkin sampai 3 detik (bukan waktu formal, hanya butuh waktu yang cukup untuk berkedip).