Oracle
 sql >> база данни >  >> RDS >> Oracle

Актуализирайте n произволни реда в SQL

Бих използвал 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 секунди (официално време не е отчитано, просто отне достатъчно време, за да мига).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заявка с IN параметри, разделени със запетая в PLSQL

  2. Как мога да разреша грешка ORA-01427 (подзаявката с един ред връща повече от един ред)?

  3. Разберете историята на SQL заявките

  4. Най-добрият начин за свързване на родителски и дъщерни таблици

  5. Как да инсталирате Oracle Database на Windows