Бих използвал 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
)
Действителната причина, поради която бих използвал ROWID, обаче не е за ефективност (все пак ще направи пълно сканиране на таблица) - вашият SQL може да не актуализира броя на редовете, които искате, ако колона m
не е уникален.
Само с 1000 реда не трябва да се притеснявате за ефективността (може би със сто милиона реда). Без никакъв индекс в тази таблица, вие сте заседнали в извършването на пълно сканиране на таблица, за да изберете произволни записи.
[РЕДАКТИРАНЕ:] „Но какво ще стане, ако има 100 000 реда“
Е, това все още е с 3 порядъка по-малко от 100 милиона.
Изпълних следното:
create table xyz as select * from all_objects;
[създадох около 50 000 реда в моята система - неиндексирани, точно като вашата таблица]
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;
Това отне приблизително 1,5 секунди. Може би беше 1 секунда, може би до 3 секунди (официално време не е отчитано, просто отне достатъчно време, за да мига).