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

update business_newset fare1_balance_ratio = (select BALANCE_RATIO             from bfare2where bfare2.exchange_type = business_new.exchange_type andbfare2.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')

执行计划是这样的:

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

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

merge into business_new using bfare2
on (bfare2.exchange_type = business_new.exchange_type andbfare2.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 updateset 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,bfare2where bfare2.exchange_type = business_new.exchange_type andbfare2.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 ;

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

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

转载于:https://www.cnblogs.com/zhjh256/p/11173252.html

oracle update from多表性能优化一例相关推荐

  1. oracle no expand,NO_EXPAND Hint性能优化一例

    耗时较长的SQL select msn.serial_number, msi.description from mtl_system_items_tl msi , mtl_serial_numbers ...

  2. Oracle 数据库表性能优化

    Oracle 数据库表性能优化 最近在一次工作过程中,遇到了oralce 表性能慢的问题.一个历史表,一个月将近1000多万的数据量,想查询这个表的数据,只使用了一个简单的语句,却一个多小时都查不出来 ...

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

    1.什么是派生表derived 关键字:子查询-->在From后where前的子查询 例子: mysql> explain select * from (select * from t) ...

  4. mysql update emp set_Mysql数据库性能优化一

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  5. oracle 9i hwm,Oracle 10g HWM原理及性能优化

    摘 要: HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线,HWM对全表扫描的性能有非常大的影响.当全表扫描时,Oracle会读取HWM下所有的块,即 ...

  6. MySQL 大表性能优化

    单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时 ...

  7. oracle hwm调整语法,Oracle 10g HWM原理及性能优化

    摘  要: HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线,HWM对全表扫描的性能有非常大的影响.当全表扫描时,Oracle会读取HWM下所有的块, ...

  8. oracle tabe unlock_Oracle 学习之性能优化(四)收集统计信息

    emp表有如下数据.SQL> select ename,deptno from emp; ENAME   DEPTNO ------------------------------ ------ ...

  9. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...

    Oracle12c中内存列存储 内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数 ...

最新文章

  1. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
  2. 通用电气Predix改革客户运作的三大用途
  3. 带头结点的单链表的初始化,建立,插入,查找,删除
  4. Make my home's PC as proxy server to surf internet
  5. LabView学习笔记(十):条件结构
  6. ACL2021 | CMU和北邮联合提出的DualGCN在基于Aspect的情感分析任务上达到了SOTA
  7. mysql variables详解_MySQL information_schema详解 GLOBAL_VARIABLES和SESSION_VARIABLES
  8. AI未来 - 李开复 - 未来8成的工作受影响 - 读后感
  9. button类java_Swing JButton类
  10. Moviepy自动化视频处理:添加音频、背景音乐,实现多轨音频
  11. LDC 1.14.0 发布,高性能 dlang 编译器
  12. typora里面如何快捷改变字体颜色?
  13. 微博爬虫python_利用python实现新浪微博爬虫
  14. Django开发个人博客网站——12、实现不同大小的标签云样式
  15. linux系统的文件系统管理
  16. 数据分析_常见的业务分析指标及模型介绍
  17. 计算机主板 安装系统,技嘉GA-B150M-D3V主板u盘重装系统win10步骤
  18. 请求分页置换算法——先进先出算法(FIFO)
  19. 【牛客访谈】对话何俊林:腾讯百度华为搜狗和滴滴面试题汇总
  20. 安卓 关于隐藏虚拟按键

热门文章

  1. python 输出大文本文件
  2. PHP解决方案@黑名单过滤
  3. mysql 相关命令
  4. Citrix Receiver For Linux 预览版
  5. [WebDev]Web 开发与设计师速查手册大全
  6. Coolite Toolkit学习笔记六:常用控件Accordion、ToolBar、ToolTip
  7. 构建静态服务器_为静态网站构建无服务器联系表
  8. 面试官问你想找什么工作_找工作时如何面试面试官
  9. css flexbox模型_5分钟内学习CSS Flexbox-初学者教程
  10. 如何获取boss直聘搜索牛人被屏蔽的姓名