Usaría el 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
)
Sin embargo, la razón real por la que usaría ROWID no es por eficiencia (aún hará un escaneo completo de la tabla):es posible que su SQL no actualice la cantidad de filas que desea si la columna m
no es único.
Con solo 1000 filas, no debería preocuparse por la eficiencia (tal vez con cien millones de filas). Sin ningún índice en esta tabla, está atascado haciendo un escaneo completo de la tabla para seleccionar registros aleatorios.
[EDITAR:] "Pero, ¿y si hay 100 000 filas?"
Bueno, eso sigue siendo 3 órdenes de magnitud menos de 100 millones.
Ejecuté lo siguiente:
create table xyz as select * from all_objects;
[creó alrededor de 50 000 filas en mi sistema, no indexadas, al igual que su tabla]
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;
Esto tomó aproximadamente 1.5 segundos. Tal vez fue 1 segundo, tal vez hasta 3 segundos (no lo cronometré formalmente, solo tomó el tiempo suficiente para parpadear).