问题1、
核心数据库使用的共享服务器模式,导致异常等待事件
virtual circuit status
非常巨大。
ORACLE 官方描述如下:
"virtual circuit wait" - for when the shared server is
blocked waiting on a specific
circuit / message
检查核心数据库确实使用了共享模式,修改提取数据的DB_LINK,使用独占的模式连接来避免这个问题
问题2、
分析发现存储过程都调用了函数Get_Rate,而Get_Rate大量循环的调用语句,我测试的时候调用测试未300W次,并且Get_Rate函数使用游标取出数据进行循环,而引用的表T_CHG_RATE来自远程,这样大量循环调用在加上远程网络延迟,等待时间也就加长。
和智软商量后决定建立Get_Rate到本地,并且加入判断如果为人民币就不调用此函数。此游标经过调整数据返回速度大大减少,几个小时的返回时间减少到5分钟左右。
问题 3、
分析发现,很多存储过程,游标每返回一行数据就会做一条判断,而判断的表确是放通过DB_LINK进行调用,如果游标返回很大量的行,那网络的延迟就会越发的明显。
建议建立判断表在本地加快速度,同时考虑更好的游标数据抽取方式,不实用循环,待改进。
create or replace procedure Bulk_Test2(p_array_size in number)
as
l_tablename dbms_sql。Varchar2_Table;
cursor c is select table_name from user_tables;
begin
open c;
loop
fetch c bulk collect into l_tablename limit p_array_size;
forall i in 1..l_tablename count
insert into t3 values (l_tablename(i));
exit when c%notfound;
end loop;
end;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7728585/viewspace-719224/ ,如需转载,请注明出处,否则将追究法律责任。