Oracle Sql优化之Merge 改写优化Update
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的更多相关文章
- oracle SQL语句练习MERGE、模糊查询、排序、
Oracle支持的SQL指令可分为数据操作语言语句.数据定义语言语句.事务控制语句.会话控制语句等几种类型:1.数据操作语言语句数据操作语言语句(Data manipulation language, ...
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- merge into优化sql(转)
使用Merge INTO优化SQL,性能提升巨大 分类: Oracle 2017-04-13 10:55:07 说说背景:开发有个需求,需要对新加的一个字段根据特定的业务逻辑更新数据.TPS_TR ...
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
- oracle管理优化必备语句以及oracle SQL语句性能调整
本文转自http://www.dataguru.cn/article-3302-1.html oracle数据库管理优化必备语句: 1. SELECT T.START_TIME,T.USED_UBLK ...
- [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)
前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综 ...
- Oracle SQL的优化
SQL的优化应该从5个方面进行调整:1.去掉不必要的大型表的全表扫描2.缓存小型表的全表扫描3.检验优化索引的使用4.检验优化的连接技术5.尽可能减少执行计划的Cost SQL语句:是对数据库(数据) ...
- Oracle SQL优化器简介
目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...
- oracle sql 优化大全
转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...
随机推荐
- 洛谷-生活大爆炸版石头剪刀布-NOIP2014提高组复赛
题目描述 Description 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版 ...
- Xcode7修改模块生成网络权限(ATS配置)
直接找 前往->前往文件夹->然后复制下面的路径填入框内,回车就能看到想要替换的文件夹了 /Applications/Xcode.app/Contents/Developer/Pla ...
- 2015 ACM/ICPC Asia Regional Shenyang Online
1001 Traversal 1002 Best Solver 1003 Minimum Cut 类似于POJ 3417的做法. 考虑每条新边对树边的覆盖次数. 每条树边被覆盖的次数其实就是断裂这条树 ...
- laravel常用拓展库
1.laravel-dompdf:pdf生成器 git地址:https://github.com/barryvdh/laravel-dompdf 2.
- iOS中的触摸事件,手势识别,摇晃事件等
在iOS中,事件可以划分为以下几类: 1.触摸事件:通过触摸,手势进行触发(手指点击.缩放等) 2.运动事件:通过加速器触发(例如手机晃动) 3.远程控制事件:通过其他远程设备触发(例如耳机控制按钮) ...
- Nginx “邪恶” rewrite
概述 本文主要针对nginx rewrite指令困惑的地方进行讲解,中间会涉及部分原理部分,我尽量用通俗易懂的语言来形容 功能讲解 大致流程 The ngx_http_rewrite_module m ...
- .Net_用控制台程序打印指定行数的三角型(面试题)
.Net_用控制台程序打印指定行数的三角型(面试题) 下面是一个由*号组成的4行倒三角形图案.要求: 1.输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”: ...
- do-while、while、for做循环算5的阶乘
#include "stdio.h" void main() { ,r=; do { r*=d; d++; }); printf("5的阶乘5!为:%d",r) ...
- 五、oracle 表的管理
一.表名和列名的命名规则1).必须以字母开头2).长度不能超过30个字符3).不能使用oracle的保留字4).只能使用如下字符 a-z,a-z,0-9,$,#等 二.数据类型1).字符类char 长 ...
- sql 将表B中不存在表A的数据 插入到表A中
insert into tableA select * from tableB b where not exists(select 1 from tableA a where a.id = b.id) ...