oracle update from多表性能优化一例

oracle update from多表性能优化一例,第1张

概述这几天测试java内存数据库,和oracle比较时发下一个update from语句很慢,如下: update business_new set fare1_balance_ratio = (select BALANCE_RATIO from bfare2 where bfare2.exchange_type

这几天测试java内存数据库,和oracle比较时发下一个update from语句很慢,如下:@H_403_7@

update business_new           set fare1_balance_ratio = (select BALANCE_RATIO             from bfare2                   where bfare2.exchange_type = business_new.exchange_type and                         bfare2.stock_type = business_new.stock_type and                         (bfare2.@R_769_5021@_way = business_new.@R_769_5021@_way) and                         (bfare2.@R_769_5021@_type = business_new.@R_769_5021@_type)         and bfare2.fare_type = 0)

执行计划是这样的:@H_403_7@

@H_403_7@@H_403_7@

从执行计划可以看出,走的就是nl关联,所以慢是正常的。@H_403_7@

于是将其改写为merge,如下:@H_403_7@

merge into business_new using bfare2on (bfare2.exchange_type = business_new.exchange_type and                         bfare2.stock_type = business_new.stock_type and                         (bfare2.@R_769_5021@_way = business_new.@R_769_5021@_way) and                         (bfare2.@R_769_5021@_type = business_new.@R_769_5021@_type)         and bfare2.fare_type = 4)        when matched then update           set business_new.farex_balance_ratio = bfare2.BALANCE_RATIO

改写后执行计划如下:@H_403_7@

@H_403_7@@H_403_7@

很快就跑出来了。需要注意的是,update语句本身是通过hint让两表强制走hash join的。@H_403_7@

除了用merge改写让两表关联走hash join外,还有一种更优、但有条件的做法。如下:@H_403_7@

update (select fare1_balance_ratio,BALANCE_RATIO from business_new,bfare2 where bfare2.exchange_type = business_new.exchange_type and                         bfare2.stock_type = business_new.stock_type and                         (bfare2.@R_769_5021@_way = business_new.@R_769_5021@_way) and                         (bfare2.@R_769_5021@_type = business_new.@R_769_5021@_type)         and bfare2.fare_type = 0)           set fare1_balance_ratio = BALANCE_RATIO ;

@H_403_7@@H_403_7@

这也称为inline vIEw更新法,性能是最好的,但相比merge并不明显。但表B的主键一定要在where条件中,并且是以“=”来关联被更新表,否则会遇到ORA-01779: 无法修改与非键值保存表对应的列。造成这个错误的原因是更新的列不是事实表的列,而是维度表的列。换句话说,如果两张表关联,其中一张表的关联列是主键,那么另一张表就是事实表,也就是说另一张表中的列就是可更新的;除非另一张表的关联列也是主键,否则这张表就是不可更新的,如果更新语句涉及到了这张表,就会出现ORA-1799错误。也就是,要么两张表都通过PK关联,要么只有非PK这张表可更新。@H_403_7@

至于for循环,乖乖,除非逻辑特别复杂,用for bulk collect,否则不要考虑。@H_403_7@ 总结

以上是内存溢出为你收集整理的oracle update from多表性能优化一例全部内容,希望文章能够帮你解决oracle update from多表性能优化一例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1161441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存