技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 数据库 > oracle > 正文

ORACLE 影响游标效率

来源: 技术CTO 阅读:

源表大概数据为18万左右,用游标循环插入到目标表中,目标表数据量大概30多万。正常是几分钟就执行完下列代码。这几天不知道怎么回事,执行时间达到五六个小时。不知道有什么会影响到游标效率的因素没。系统内存使用率不高,不到20%。请各位大神帮忙指点,谢谢。
 cursor cur_data is select
                             as_of_date,cif_key,account_num,cif_type
                             ,cif_rating,org_code, virtual_org
                             ,common_coa_type
                             ,iso_currency_cd
                             ,cur_book_bal
                             ,gl_devalue_t_b
                             ,gl_devalue_b
                             ,breach_flag,trade_rival_type,publish_type ,enter_scale,term_remain,term_orig
                             ,gl_account_id,contract_num ,is_trial,deal_status
                             ,t.line_of_credit_bal
                             ,task_cd
                             ,own_guarantee_bal --本行担保金额  新增
                             ,other_guarantee_bal --他行担保金额  新增
                             ……
      from ec_cdt_cif_data t
      where t.as_of_date= p_as_of_dt
      and t.task_cd=p_task_cd
      and t.deal_status='01';

 for v_cur in cur_data loop
begin
  ……中间进行字段值的处理
 insert into ec_cdt_cif_out(as_of_date       ,  --数据日期
                                  cif_key          ,  --客户代码
                                  account_num      ,  --账户
                                  cif_type         ,  --客户类型
                                  cif_rating       ,  --客户信用评级
                                  org_code         ,  --所属机构
                                  common_coa_type  ,  --产品类型
                                  iso_currency_cd  ,  --币种
                                  cur_book_bal     ,  --信用风险资产账面金额
                                  gl_devalue_t_b   ,  --专项准备
                                  gl_devalue_b     ,  --一般准备
                                  risk_expos       ,  --风险暴露
                                 ……
                                  )
                            values(v_cur.as_of_date
                                  ,v_cur.cif_key
                                  ,v_cur.account_num
                                  ,v_cur.cif_type
                                  ,v_cur.cif_rating
                                  ,v_cur.org_code
                                  ,v_cur.common_coa_type
                                  ,v_cur.iso_currency_cd
                                  ,v_cur.cur_book_bal
                                  ,v_cur.gl_devalue_t_b
                                  ,v_cur.gl_devalue_b
                                  ,v_risk_exposure
                                 ……
                                  );
--每一万行提交一次
            v_recod_count :=  v_recod_count + 1;
            if mod(v_recod_count,10000) = 0 then
              commit;
            end if;
end loop;
commit;

一个更新语句不能解决吗
如果速度慢下来了,可以查查,表上是不是增加了触发器;


PS:不建议逐行写入数据,批量 insert 比较好;
没有触发器。
代码是其他同事写的,已经不好修改了。
而且之前跑批时也是正常的。就突然在游标这里执行效率变慢了,从几分钟变成几小时。
不知道oracle中有没有什么参数是控制游标执行效率的
这里变慢问题应该是出在游标的那个查询语句中,或是“中间字段值处理”部分的查询中
检查下该语句的执行计划,确认统计信息是否准确,进行优化
估计是以前表里的数据量少,随着时间的增加数据也在加。一般的机器从几w到 到十几w没什么变化,到几十w的就慢了。
你可以查看 游标中的查询中语句的执行计划。。。

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^