首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

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

2012-12-16 
oracle 并发 大量数据(成千上万 )需要修改时候怎么处理?在电子商务网站中,并发状态1,如果同时有大量数据需

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的时候还是要用循环,分十万~百万条记录左右,提交一次
[其他解释]
还有,使用并行参数

热点排行
Bad Request.