update x set y = null takes a long time

后端 未结 5 746
孤城傲影
孤城傲影 2021-01-04 03:59

At work, I have a large table (some 3 million rows, like 40-50 columns). I sometimes need to empty some of the columns and fill them with new data. What I did not expect is

5条回答
  •  萌比男神i
    2021-01-04 04:13

    I would try what Tom Kyte suggested on large updates. When it comes to huge tables, it best to go like this : take a few rows, update them, take some more, update those etc. Don't try to issue an update on all the table. That's a killer move right from the start.

    Basically create binary_integer indexed table, fetch 10 rows at a time, and update them.

    Here is a piece of code that i have used of large tables with success. Because im lazy and its like 2AM now ill just copy paste it here and let you figure it out, but let me know if you need help :

    DECLARE
    
       TYPE BookingRecord IS RECORD ( 
          bprice  number,
          bevent_id number,
          book_id number
          );
    
       TYPE array is TABLE of BookingRecord index by binary_integer;
      l_data array;
    
     CURSOR c1 is
        SELECT LVC_USD_PRICE_V2(ev.activity_version_id,ev.course_start_date,t.local_update_date,ev.currency,nvl(t.delegate_country,ev.sponsor_org_country),ev.price,ev.currency,t.ota_status,ev.location_type) x,
           ev.title,
           t.ota_booking_id
          FROM ota_gsi_delegate_bookings_t@diseulprod t,
               inted_parted_events_t@diseulprod ev
          WHERE t.event_id = ev.event_id
            and t.ota_booking_id = 
    BEGIN
       open c1;
            loop
                fetch c1 bulk collect into l_data limit 20;
    
                 for i in 1..l_data.count
                   loop
                       update ou_inc_int_t_01 
                          set price = l_data(i).bprice,
                              updated = 'Y'
                        where booking_id = l_data(i).book_id;
                   end loop;
    
               exit when c1%notfound;
           end loop;
           close c1;
    END;
    

提交回复
热议问题