这几天测试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 = '')

执行计划是这样的:

从执行计划可以看出,走的就是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 = '')
when matched then update
set business_new.farex_balance_ratio = bfare2.BALANCE_RATIO

改写后执行计划如下:

很快就跑出来了。需要注意的是,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 = '')
set fare1_balance_ratio = BALANCE_RATIO ;

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

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

oracle update from多表性能优化一例的更多相关文章

  1. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

  2. MySQL派生表(derived)优化一例

    1.什么是派生表derived 关键字:子查询–>在From后where前的子查询 mysql; +----+-------------+------------+------+-------- ...

  3. ORACLE数据库学习之SQL性能优化详解

                                                                                    Oracle  sql 性能优化调整 ...

  4. oracle 11g亿级复杂SQL优化一例(数量级性能提升)

    自从16年之后,因为工作原因,项目中就没有再使用oracle了,最近最近支持一个项目,又要开始负责这块事情了.最近在跑性能测试,配置全部调好之后,不少sql还存在性能低下的问题,主要涉及执行计划的不合 ...

  5. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  6. Oracle在Linux下的性能优化

    Oracle数据库内存参数的优化 Ø       与oracle相关的系统内核参数 Ø       SGA.PGA参数设置   Oracle下磁盘存储性能优化 Ø       文件系统的选择(ext2 ...

  7. Android性能优化典例(一)

    在Android开发过程中,很多时候往往因为代码的不规范.api使用不恰当.控件的使用场景考虑不全面和用户不恰当的操作等都能引发一系列性能问题的,下面就是我目前整理的一些Android开发过程中需要注 ...

  8. Oracle高水位线(HWM)及性能优化

    说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我们知道,ORACLE在逻辑存储上分4个粒度:表空间,段,区和块.    (1)块:是粒度最小的存储单位,现在标准的块大小是8K,ORACL ...

  9. Oracle update时做表关联

    感觉还是sqlserver中的写法比较好理解,Oracle的写法都快把我搞晕了, 注意: 1.要修改的表,不要加入到子查询中,用别名在子查询中与其他表进行关联即可. 2.exsits不能少,exsit ...

随机推荐

  1. Windows下搭建TensorFlow的GPU版本

    1.下载python3.5.2版本并安装(必须是3.5版本,而且3.5后不带字母的版本) 2.使用下面的地址下载tensorflow的GPU版本 http://www.lfd.uci.edu/~goh ...

  2. ABP问题集结

    添加js跨域访问. 在Startup.cs文件中  public IServiceProvider ConfigureServices(IServiceCollection services)中添加 ...

  3. Web渗透

  4. OSPF但区域配置

    原理概述 实验内容 实验拓扑 实验编址 实验步骤1.基本配置配置完成后,使用ping命令检测 2.部署单区域OSPF网络使用命令ospf创建并运行OSPF 其中1是进程号,如果没有写明进程号,则默认为 ...

  5. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.reduce方法 reduce方法,顾名思义就是减少 reduce(function,se ...

  6. 两个不同的账户登录两个浏览器,导入同样的excel表格。数据出现重复

    1.场景: 两个不同的账户登录两个浏览器,导入同样的excel表格.业务逻辑已经有验重校验,但数据仍然出现重复,锁定是并发问题导致. 2.参考博客: https://cloud.tencent.com ...

  7. luoguP2768: 珍珠项链(矩阵乘法优化DP)

    题意:有K种珍珠,每种N颗,求长度为1~N的项链,包含K种珍珠的项链种类数.N<=1e9, K<=30; 思路:矩阵快速幂,加个1累加前缀和即可. #include<bits/std ...

  8. ZOJ - 3265: Strange Game (优化 二分图匹配)

    pro:有一个长度为N的数组a[i],要求选择k[i]>0,使得b[i]=a[i]^k[i]%M中出现的不同数最多.N<=200, M<=1e9: sol:a^x%p的个数的有限的, ...

  9. wordpress自定义菜单高级属性设置

    我们在创建wordpress自定义菜单时,右上角有一个screen option,点击展开可以选择显示菜单的高级属性,包括:链接目标Link Target.标题属性Title Attribute.CS ...

  10. MSSQL行车列规则

    行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...