Ich würde die ROWID verwenden:
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
)
Der eigentliche Grund, warum ich ROWID verwenden würde, ist jedoch nicht die Effizienz (es wird immer noch ein vollständiger Tabellenscan durchgeführt) - Ihr SQL aktualisiert möglicherweise nicht die Anzahl der gewünschten Zeilen, wenn die Spalte m
ist ist nicht eindeutig.
Bei nur 1000 Zeilen sollten Sie sich nicht wirklich Sorgen um die Effizienz machen (vielleicht bei hundert Millionen Zeilen). Ohne einen Index für diese Tabelle müssen Sie einen vollständigen Tabellenscan durchführen, um zufällige Datensätze auszuwählen.
[BEARBEITEN:] "Aber was, wenn es 100.000 Zeilen gibt"
Nun, das sind immer noch 3 Größenordnungen weniger als 100 Millionen.
Ich habe Folgendes ausgeführt:
create table xyz as select * from all_objects;
[hat ungefähr 50.000 Zeilen auf meinem System erstellt - nicht indiziert, genau wie Ihre Tabelle]
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;
Dies dauerte ungefähr 1,5 Sekunden. Vielleicht war es 1 Sekunde, vielleicht bis zu 3 Sekunden (hatte es nicht offiziell zeitlich festgelegt, es dauerte nur ungefähr genug Zeit, um zu blinzeln).