Ik zou de ROWID gebruiken:
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
)
De werkelijke reden dat ik ROWID zou gebruiken, is echter niet voor efficiëntie (het zal nog steeds een volledige tabelscan doen) - uw SQL werkt mogelijk niet het aantal rijen bij dat u wilt als kolom m
is niet uniek.
Met slechts 1000 rijen hoeft u zich geen zorgen te maken over efficiëntie (misschien met honderd miljoen rijen). Zonder index op deze tabel zit je vast aan een volledige tabelscan om willekeurige records te selecteren.
[EDIT:] "Maar wat als er 100.000 rijen zijn"
Nou, dat is nog steeds 3 ordes van grootte minder dan 100 miljoen.
Ik heb het volgende uitgevoerd:
create table xyz as select * from all_objects;
[heeft ongeveer 50.000 rijen gemaakt op mijn systeem - niet-geïndexeerd, net als uw tabel]
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;
Dit duurde ongeveer 1,5 seconde. Misschien was het 1 seconde, misschien tot 3 seconden (niet formeel getimed, het duurde gewoon lang genoeg om te knipperen).