在电子商务网站中,并发状态
1,如果同时有大量数据需要快速查询出来怎么处理?
2,如果同时有大量数据需要修改怎么处理?
该采用什么方法处理请高手指导下

解决方案 »

  1.   

    可以参考一下“乐观锁”,toms kyte那本书
      

  2.   

             对于大的数据量,只有分而制之,可行的方法:
             1.做分区表,逐个分区处理
              2.按照表里面的条件,大概100000条记录一个循环,update完立即提交。
              3.如果磁盘很大,可以用磁盘换性能,把满足条件的行记录,插入到新表,update的时候还是要用循环,分十万~百万条记录左右,提交一次
      

  3.   

    再附上一种方法吧
    用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);