1.待改写语句如下

update table1 f
set f.ljjine1= (select nvl(sum(nvl(b.jine1,0)),0) from table1 b where b.kjqj<=f.kjqj and b.gs=f.gs and b.bm=f.bm and b.yw=f.yw and b.currency=f.currency and substr(b.kjqj,1,4)=substr(f.kjqj,1,4)),
f.jine2 = (select nvl(sum(nvl(e.jine1,0)),0) from table2 e where e.kjqj=f.kjqj=e.gs=f.gs and e.bm=f.bm and e.yw= f.yw),
f.ljjine2 = (select nvl(sum(nvl(e.jine1,0)),0) from table2 e where e.kjqj<=f.kjqj and e.gs=f.gs and e.bm=f.bm and e.yw=f.yw and substr(e.kjqj,1,4)=substr(f.kjqj,1,4))
where substr(f.kjqj,1,4)= extract(year from sysdate)

2.分析语句:

a.第一个子查询除了等值条件,还有一个 “b.kjqj<=f.kjqj”非等值比较,因此这是一个累加,需要采用分析函数

b.第二个子查询有sum聚合函数,因此要把关联条件放入group by中,分组汇总

c.第三个子查询与第二个类似,只是等值条件改成不等值条件,所以要采用分析函数

3.子查询改写

第一个子查询改写如下

select b.rowid as rid ,sum(b.jine1) over (partition by b.gs,b.bm,b.yw,b.curreny order by b.kjqj) as ljjine1
from table1 b where substr(b.kjqj,1,4) = extract(year from sysdate)

第二个子查询改写,把关联列放到Select和group by后面

select e.gs,e.bm,e.yw,e.kjqj,sum(jine1) as jine2
from table2 e
where substr(e.kjqj,1,4)=extract(year from sysdate)
group by e.gs,e.bm,e.yw,e.kjqj

第三个子查询,可以在第二次子查询的基础上调用一次分析函数进行累加处理

select e.gs,e.bm,e.yw,e.kjqj,
sum(e.jine2) over(partition by e.gs,e.bm,e.yw order by e.kjqj) as ljjine2
from
(select e.gs,e.bm,e.yw,e.kjqj,sum(jine1) as jine2
from table2 e
where substr(e.kjqj,1,4)=extract(year from sysdate)
group by e.gs,e.bm,e.yw,e.kjqj) e

4.Merge改写的最终结果如下

Merge into table1 f
using(select b.rowid as rid ,sum(b.jine1) over (partition by b.gs,b.bm,b.yw,b.curreny order by b.kjqj) as ljjine1
from table1 b left join (
select e.gs,e.bm,e.yw,e.kjqj,
sum(e.jine2) over(partition by e.gs,e.bm,e.yw order by e.kjqj) as ljjine2
from
(select e.gs,e.bm,e.yw,e.kjqj,sum(jine1) as jine2
from table2 e
where substr(e.kjqj,1,4)=extract(year from sysdate)
group by e.gs,e.bm,e.yw,e.kjqj) e
) e on(b.gs=e.gs and b.bm=e.bm and b.yw=e.yw and b.kjqj=e.kjqj)
where substr(b.kjqj,1,4) = extract(year from sysdate)) b on (f.rowid=b.rid)
when matched then
update set
f.ljjine1= nvl(b.ljjine1,0),
f.ljjine2=nvl(b.ljjine2,0),
f.jine2 = nvl(b.jine2,,0)

Oracle Sql优化之Merge 改写优化Update的更多相关文章

  1. oracle SQL语句练习MERGE、模糊查询、排序、

    Oracle支持的SQL指令可分为数据操作语言语句.数据定义语言语句.事务控制语句.会话控制语句等几种类型:1.数据操作语言语句数据操作语言语句(Data manipulation language, ...

  2. Oracle SQL优化[转]

    Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...

  3. merge into优化sql(转)

    使用Merge INTO优化SQL,性能提升巨大 分类: Oracle 2017-04-13 10:55:07   说说背景:开发有个需求,需要对新加的一个字段根据特定的业务逻辑更新数据.TPS_TR ...

  4. Oracle SQL性能优化技巧大总结

    http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...

  5. oracle管理优化必备语句以及oracle SQL语句性能调整

    本文转自http://www.dataguru.cn/article-3302-1.html oracle数据库管理优化必备语句: 1. SELECT T.START_TIME,T.USED_UBLK ...

  6. [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)

    前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综 ...

  7. Oracle SQL的优化

    SQL的优化应该从5个方面进行调整:1.去掉不必要的大型表的全表扫描2.缓存小型表的全表扫描3.检验优化索引的使用4.检验优化的连接技术5.尽可能减少执行计划的Cost SQL语句:是对数据库(数据) ...

  8. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  9. oracle sql 优化大全

    转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...

随机推荐

  1. NOIP2010-普及组复赛-第一题-数字统计

    题目描述 Description 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 ...

  2. runtime官方文档

    OC是一种面向对象的动态语言,作为初学者可能大多数人对面向对象这个概念理解的比较深,而对OC是动态语言这一特性了解的比较少.那么什么是动态语言?动态语言就是在运行时来执行静态语言的编译链接的工作.这就 ...

  3. 让人头疼的CSS兼容

    先说点Hack的知识(真正的高手是不用Hack的,但要成为高手必须通过Hack这一关) /* CSS属性级Hack */ color:red; /* 所有浏览器可识别*/ _color:red; /* ...

  4. 【实验室笔记】C#上位机学习笔记

    用C#编写上位机,基本流程是[1]串口配置,[2]串口发送数据,[3]串口接收数据. [1]串口配置 串口的属性配置包括: No.1串口端口号 No.2串口波特率 No.3串口数据位 No.4串口停止 ...

  5. Ubuntu iptalbes 保存配置

     ubuntu 保存防火墙命令,iptables方式:1.iptables 配置好策略2.iptables-save > /etc/network/iptables.up.rules ,配置的策 ...

  6. linux安装文件命令

    tar -zxvf apache-tomcat.tar.gz -C /home/poka 注:安装tar.gz的安装包 设置系统自动启动tomcat 切换到root用户,执行命令 #chkconfig ...

  7. ios设置textField只能输入数字用于电话号码

    首先在.xib中将UITextField的Keyboard设置为Number Pad,但是使用时键盘会切回别的键盘无法对内容进行校验.通过神奇的百度我知道了通过以下方法可以解决这样的问题: 首先让.x ...

  8. python中telnetlib模块的使用

    一.Windows下开启Telnet服务 (详见:与Win7防火墙无缝结合 Telnet功能测试) 1.Windows 2000/XP/2003/Vista:默认已安装但禁止了Telnet服务 (1) ...

  9. Windows使用小技巧

    一.windows7 系统切换到 administrator用户 先进入windows 7的安全模式.. (这你应该会吧?) 然后系统会自动调出用administrator 帐号登录.. 密码你必须要 ...

  10. 关于js中原型链的理解

    我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,一个对象.无论什么时候,我们只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性对象 ...