Jag skulle använda 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 faktiska anledningen till att jag skulle använda ROWID är dock inte för effektiviteten (det kommer fortfarande att göra en fullständig tabellsökning) - din SQL kanske inte uppdaterar antalet rader du vill ha om kolumn m
är inte unikt.
Med bara 1000 rader borde du egentligen inte oroa dig för effektiviteten (kanske med hundra miljoner rader). Utan något index på den här tabellen har du fastnat med att göra en fullständig tabellskanning för att välja slumpmässiga poster.
[EDIT:] "Men tänk om det finns 100 000 rader"
Tja, det är fortfarande 3 storleksordningar mindre än 100 miljoner.
Jag körde följande:
create table xyz as select * from all_objects;
[skapade cirka 50 000 rader på mitt system - icke-indexerade, precis som din tabell]
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;
Detta tog cirka 1,5 sekunder. Kanske var det 1 sekund, kanske upp till 3 sekunder (spände den inte formellt, det tog bara tillräckligt med tid att blinka).