Update n random rows in SQL

前端 未结 3 1935
予麋鹿
予麋鹿 2021-02-06 11:00

I have table which is having about 1000 rows.I have to update a column(\"X\") in the table to \'Y\' for n ramdom rows. For this i can have following query

update         


        
3条回答
  •  挽巷
    挽巷 (楼主)
    2021-02-06 11:37

    I would use the 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
    )
    

    The actual reason I would use ROWID isn't for efficiency though (it will still do a full table scan) - your SQL may not update the number of rows you want if column m isn't unique.

    With only 1000 rows, you shouldn't really be worried about efficiency (maybe with a hundred million rows). Without any index on this table, you're stuck doing a full table scan to select random records.

    [EDIT:] "But what if there are 100,000 rows"

    Well, that's still 3 orders of magnitude less than 100 million.

    I ran the following:

    create table xyz as select * from all_objects;
    

    [created about 50,000 rows on my system - non-indexed, just like your 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;
    

    This took approximately 1.5 seconds. Maybe it was 1 second, maybe up to 3 seconds (didn't formally time it, it just took about enough time to blink).

提交回复
热议问题