Oracle
 sql >> Base de données >  >> RDS >> Oracle

Mettre à jour n lignes aléatoires en SQL

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).