sql >> Database >  >> RDS >> Oracle

Update n willekeurige rijen in SQL

Ik zou de ROWID gebruiken:

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
)

De werkelijke reden dat ik ROWID zou gebruiken, is echter niet voor efficiëntie (het zal nog steeds een volledige tabelscan doen) - uw SQL werkt mogelijk niet het aantal rijen bij dat u wilt als kolom m is niet uniek.

Met slechts 1000 rijen hoeft u zich geen zorgen te maken over efficiëntie (misschien met honderd miljoen rijen). Zonder index op deze tabel zit je vast aan een volledige tabelscan om willekeurige records te selecteren.

[EDIT:] "Maar wat als er 100.000 rijen zijn"

Nou, dat is nog steeds 3 ordes van grootte minder dan 100 miljoen.

Ik heb het volgende uitgevoerd:

create table xyz as select * from all_objects;

[heeft ongeveer 50.000 rijen gemaakt op mijn systeem - niet-geïndexeerd, net als uw tabel]

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;

Dit duurde ongeveer 1,5 seconde. Misschien was het 1 seconde, misschien tot 3 seconden (niet formeel getimed, het duurde gewoon lang genoeg om te knipperen).



  1. PostgreSQL CSV importeren vanaf de opdrachtregel

  2. Hoe de SQL-uitvoeringstijd te beperken?

  3. Wat is het verschil tussen tinyint, smallint, mediumint, bigint en int in MySQL?

  4. hoe de afteltimer niet opnieuw in te stellen bij het vernieuwen van de pagina