当前位置: 代码迷 >> Oracle技术 >> oracle 并发 大量数据(成千下万 )需要修改时候怎么办
  详细解决方案

oracle 并发 大量数据(成千下万 )需要修改时候怎么办

热度:467   发布时间:2016-04-24 08:22:16.0
oracle 并发 大量数据(成千上万 )需要修改时候怎么处理?
在电子商务网站中,并发状态
1,如果同时有大量数据需要快速查询出来怎么处理?
2,如果同时有大量数据需要修改怎么处理?
该采用什么方法处理请高手指导下
------最佳解决方案--------------------
再附上一种方法吧
用rowid更新
案例:
要更新的表:T1 (id1 number, id2 number, curr_count number,.....)   --id1唯一  5亿条记录 >60GB
更新数据来源:T2 (id2 number, curr_count number)   --id2唯一  4.8亿
更新逻辑:T2中的每一条记录,都到T1中找到对应的记录(T2.id2=T1.id2),更新T1.curr_count=T2.curr_count
限制条件:只能在线更新(应用程序一直在访问这个表,所以不能用INSERT SELECT),不能占用太多系统资源,要求3天之内更新完毕。
alter table T1 storage(buffer_pool keep);    -- keep buffer pool size = 6GB
declare
  cursor cur_t2 is 
    select /*+ use_hash(T1,T2) parallel(T1,16) parallel_index(IX_T1_id2,16) */
       T2.id2, T2.curr_count, T1.rowid row_id
    from T1, T2
    where T1.id2=T2.id2
    order by T1.rowid;
  v_counter number;
begin
  v_counter := 0;
  for row_t2 in cur_t2 loop
    update T1 set curr_count=row_t2.curr_count
       where rowid=row_t2.row_id;
    v_counter := v_counter + 1;
    if (v_counter>=1000) then
      commit; 
      v_counter := 0;
    end if;
  end loop;
  commit;
end;
/
alter table T1 storage(buffer_pool default);


------其他解决方案--------------------
分表、分区、控制死锁。
------其他解决方案--------------------
可以参考一下“乐观锁”,toms kyte那本书
------其他解决方案--------------------
         对于大的数据量,只有分而制之,可行的方法:
         1.做分区表,逐个分区处理
          2.按照表里面的条件,大概100000条记录一个循环,update完立即提交。
          3.如果磁盘很大,可以用磁盘换性能,把满足条件的行记录,插入到新表,update的时候还是要用循环,分十万~百万条记录左右,提交一次
------其他解决方案--------------------
还有,使用并行参数
  相关解决方案