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