J'utiliserais le 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
)
La raison réelle pour laquelle j'utiliserais ROWID n'est pas pour l'efficacité cependant (il fera toujours une analyse complète de la table) - votre SQL peut ne pas mettre à jour le nombre de lignes que vous voulez si la colonne m
n'est pas unique.
Avec seulement 1000 lignes, vous ne devriez pas vraiment vous soucier de l'efficacité (peut-être avec une centaine de millions de lignes). Sans aucun index sur cette table, vous êtes obligé de faire une analyse complète de la table pour sélectionner des enregistrements aléatoires.
[MODIFIER :] "Mais que se passe-t-il s'il y a 100 000 lignes ?"
Eh bien, c'est toujours 3 ordres de grandeur de moins que 100 millions.
J'ai exécuté ce qui suit :
create table xyz as select * from all_objects;
[créé environ 50 000 lignes sur mon système - non indexées, tout comme votre table]
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;
Cela a pris environ 1,5 seconde. Peut-être que c'était 1 seconde, peut-être jusqu'à 3 secondes (je ne l'ai pas chronométré formellement, ça a juste pris assez de temps pour clignoter).