ITPub博客

首页 > 数据库 > Oracle > 一个SQL语句的优化

一个SQL语句的优化

原创 Oracle 作者:e71hao 时间:2016-04-15 17:12:25 0 删除 编辑
1.要优化的语句:把表的5个字段同步到另外一个表
update bu_clear_detail_bak20160412 a
   set (a.card_ser_numer,
        a.trans_amount2,
        a.trans_type_mark,
        a.card_online_num,
        a.trans_number,
        a.issr_mark) =
       (select b.card_ser_numer,
               b.trans_amount2,
               b.trans_type_mark,
               b.card_online_num,
               b.trans_number,
               b.issr_mark
          from bu_clear_detail_bak_addcolmns b
         where a.id = b.id);
表的统计数据:bu_clear_detail_bak20160412 有23万数据,bu_clear_detail_bak_addcolmns有30万数据。表上没有约束,没有其他的锁。

这个语句执行了30分钟后,还是没有结果。kill掉。
2.两个表数据量不大。为了确定这个语句能不能更新,是否有锁,可以加个约束条件,执行1000条。如:
update bu_clear_detail_bak20160412 a
   set (a.card_ser_numer,
        a.trans_amount2,
        a.trans_type_mark,
        a.card_online_num,
        a.trans_number,
        a.issr_mark) =
       (select b.card_ser_numer,
               b.trans_amount2,
               b.trans_type_mark,
               b.card_online_num,
               b.trans_number,
               b.issr_mark
          from bu_clear_detail_bak_addcolmns b
         where a.id = b.id)
 where rownum < 1000 ;
时间为3分18秒。这个可以证明的是:更新语句没有被其他对象锁住。更新速度很慢。
3.猜想这个语句的执行计划,应该不难,从bu_clear_detail_bak20160412表里取出一条数据,去bu_clear_detail_bak_addcolmns表中检索相同的ID,然后把5个字段更新如此循环100次。bu_clear_detail_bak_addcolmns表有30万数据,循环30万X100次。是不是想到解决办法了,对,就是加索引。在表bu_clear_detail_bak_addcolmns的ID列加索引。测试,全部更新,30秒完成

4.问题
是完美解决了,但是研究没有停止.把表bu_clear_detail_bak_addcolmns的索引删除,我们来看看它执行的系统指标表现:
us为20%,用10046事件跟踪SQL都是db file scattered read等待事件,TOP SQL



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30393770/viewspace-2081993/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: rac错误调试
请登录后发表评论 登录
全部评论

注册时间:2015-08-05

  • 博文量
    133
  • 访问量
    235558