Jeg ville bruge 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
)
Den egentlige grund til, at jeg ville bruge ROWID, er dog ikke for effektiviteten (det vil stadig lave en fuld tabelscanning) - din SQL opdaterer muligvis ikke antallet af rækker, du ønsker, hvis kolonne m
er ikke unikt.
Med kun 1000 rækker, skal du egentlig ikke være bekymret for effektiviteten (måske med hundrede millioner rækker). Uden noget indeks på denne tabel sidder du fast ved at lave en fuld tabelscanning for at vælge tilfældige poster.
[EDIT:] "Men hvad nu hvis der er 100.000 rækker"
Nå, det er stadig 3 størrelsesordener mindre end 100 millioner.
Jeg kørte følgende:
create table xyz as select * from all_objects;
[oprettet omkring 50.000 rækker på mit system - ikke-indekseret, ligesom din 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;
Dette tog cirka 1,5 sekunder. Måske var det 1 sekund, måske op til 3 sekunder (talte det ikke formelt, det tog bare nok tid at blinke).