首页 > 数据库 >oracle update from多表更新性能优化一例

oracle update from多表更新性能优化一例

时间:2022-12-10 16:34:41浏览次数:66  
标签:多表 business exchange update bfare2 oracle new entrust type

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

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.entrust_way = business_new.entrust_way) and
(bfare2.entrust_type = business_new.entrust_type)
and bfare2.fare_type = '0')

执行计划是这样的:

oracle update from多表更新性能优化一例_执行计划

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

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

merge into business_new using bfare2
on (bfare2.exchange_type = business_new.exchange_type and
bfare2.stock_type = business_new.stock_type and
(bfare2.entrust_way = business_new.entrust_way) and
(bfare2.entrust_type = business_new.entrust_type)
and bfare2.fare_type = '4')
when matched then update
set business_new.farex_balance_ratio = bfare2.BALANCE_RATIO

改写后执行计划如下:

oracle update from多表更新性能优化一例_表关联_02

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

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

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.entrust_way = business_new.entrust_way) and
(bfare2.entrust_type = business_new.entrust_type)
and bfare2.fare_type = '0')
set fare1_balance_ratio = BALANCE_RATIO ;

oracle update from多表更新性能优化一例_主键_03

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

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

 

​LightDB Enterprise Postgres--金融级关系型数据库,更快、更稳、更懂金融!​



标签:多表,business,exchange,update,bfare2,oracle,new,entrust,type
From: https://blog.51cto.com/zhjh256/5927785

相关文章

  • mysql/lightdb for pg/oracle jdbc大数据量插入优化
    10.10.6 大数据量插入优化在很多涉及支付和金融相关的系统中,夜间会进行批处理,在批处理的一开始或最后一般需要将数据回库,因为应用和数据库通常部署在不同的服务器,而且应用......
  • oracle 12.2+支持mysql与postgresql中的collate(排序规则)特性
    sqlserver,mysql,postgresql都支持针对字符串类型定义排序规则的概念(collate),一般来说,排序规则分为三种:基于二进制,是否区分大小写,是否区分重音。例如sqlserver中:SELE......
  • oracle/mysql/lightdb/postgresql java jdbc类型映射
    MySQL数据类型JAVA数据类型JDBCTYPE普通变量类型主键类型BIGINTLongBIGINT支持支持TINYINTByteTINYINT支持不支持SMALLINTShortSMALLINT支持不支持MEDIUMINTIntegerINTEGER......
  • oracle 10.2.0.4安装ogg执行ddl_setup.sql时,报警“ORA-20783:RECYCLEBIN must be turne
    问题描述:oracle10.2.0.4安装ogg执行ddl_setup.sql时,报警“ORA-20783:RECYCLEBINmustbeturnedoff”,如下所示:SQL>@ddl_setup.sql;GoldenGateDDLReplicationsetupscri......
  • Oracle误删除数据的恢复
    Oracle误删除数据的恢复在平时操作数据库时,难免会误删数据,或者表格,这时候不用慌张,按照如下步骤进行恢复:删除的操作有三种:DELETE和TRUNCATE只删除数据,DROP则删除整个表(结构......
  • oracle 客户端连接VBA模板使用教程
    首先解释一个VBA是什么。VBA全称:VisualBasicforApplications。我这里的是指办公软件excel中的VBA宏功能。Oracle中我们是可以多个客户端访问服务器端的。......
  • 处理oracle 大字符串类型(CLOB)读取
    在数据库读取clob类型返回的list中  如果数据超大 会报错,例如类型超4000,或Long类型只能绑定Long类型的值(大概意思如此)这时需要单独处理下clob类型的数据即可(需要注......
  • sql查询进阶操作-多表查询
    数据库的进阶操作一:连接查询1)内连接innerjoin内连接:使用语法表一innerjoin表2on字段1=字段2//在查询中需要将两张表存在对应关系的数据全部显示出来,需要使用内......
  • Oracle数据库权限学习--表或者是视图不存在
    Oracle数据库权限学习--表或者是视图不存在摘要本文写于:12.1001:00巴西踢的太烂了帮同事看一下补丁执行报错的问题.问题原因很简单.user_all_table能够后去本用......
  • Oracle数据库实现主键自增
    Oracle不同于MySQL,MySQL只需要在Navicat等工具中点个自动递增按钮就能实现主键自增,Oracle需要创建自增序列才能实现Oracle实现主键自增有多种方式,但是需要创建自增序......