下面的两个SQL是等价的,但是一个执行N小时都执行不完,一个花了一分钟。

执行计划显示
第一个语句是由外面的即将被更新的表驱动内层,相对于是一个NEST LOOP,cost非常大。
第二个语句是内层单独执行完后,与外面的筛选结果做一个HASH JOIN, cost降低了很多. UPDATE GPCOMP1.GPRECL R SET (PROMISED_BY,PROMISED_DATE)=(SELECT W.USER_ID,W.CREATED_ON FROM
(SELECT T.*,ROWNUM FROM (
SELECT A.USER_ID,A.CREATED_ON,RL.TRAN_ID,ROW_NUMBER() OVER(PARTITION BY A.CUSTNO ORDER BY A.ACTIVITY_ID DESC) RN
FROM GPCOMP1.GPRECL RL,GPCOMP1.GPACTV A
WHERE A.CUSTNO = RL.CUSTNO AND A.ACTVDATE < RL.RCLDATE AND RL.PROMISED ='Y'
) T WHERE T.RN =1) W WHERE W.TRAN_ID=R.TRAN_ID
) WHERE R.PROMISED ='Y'; PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2415251688
--------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 19278 | 433K| | 1712M (1)|999:59:59 |
| 1 | UPDATE | GPRECL | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | GPRECL | 19278 | 433K| | 9334 (1)| 00:01:53 |
|* 3 | INDEX RANGE SCAN | GPRCL_PROMISED_CUST_TRAN | 19278 | | | 103 (0)| 00:00:02 |
|* 4 | VIEW | | 338K| 11M| | 44419 (1)| 00:08:54 |
| 5 | COUNT | | | | | | |
|* 6 | VIEW | | 338K| 15M| | 44419 (1)| 00:08:54 |
|* 7 | WINDOW SORT PUSHED RANK | | 338K| 22M| 28M| 44419 (1)| 00:08:54 |
| 8 | NESTED LOOPS | | 338K| 22M| | 38703 (1)| 00:07:45 |
|* 9 | INDEX RANGE SCAN | GPRCL_PROMISED_CUST_TRAN | 19278 | 508K| | 103 (0)| 00:00:02 |
|* 10 | TABLE ACCESS BY INDEX ROWID| GPACTV | 18 | 792 | | 3 (0)| 00:00:01 |
|* 11 | INDEX RANGE SCAN | GPACTV_CUSTNO_TRUNC_ACTVDATE | 1 | | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("R"."PROMISED"='Y')
4 - filter("W"."TRAN_ID"=:B1)
6 - filter("T"."RN"=1)
7 - filter(ROW_NUMBER() OVER ( PARTITION BY "A"."CUSTNO" ORDER BY INTERNAL_FUNCTION("A"."ACTIVITY_ID") DESC)<=1)
9 - access("RL"."PROMISED"='Y')
10 - filter("A"."ACTVDATE"<"RL"."RCLDATE")
11 - access("A"."CUSTNO"="RL"."CUSTNO" AND TRUNC(INTERNAL_FUNCTION("ACTVDATE"),'fmddd')<=TRUNC(INTERNAL_FUNCTION("RL"."RCLDATE"),'fmddd')) MERGE INTO GPCOMP1.GPRECL R USING (SELECT T.USER_ID,T.CREATED_ON,T.ID FROM (
                                SELECT A.USER_ID,A.CREATED_ON,RL.ROWID AS ID,ROW_NUMBER() OVER(PARTITION BY A.CUSTNO ORDER BY A.ACTIVITY_ID DESC) RN
FROM GPCOMP1.GPRECL RL,GPCOMP1.GPACTV A
WHERE A.CUSTNO = RL.CUSTNO AND A.ACTVDATE < RL.RCLDATE AND RL.PROMISED ='Y') T
                       WHERE T.RN =1) W
ON (W.ID=R.ROWID AND R.PROMISED ='Y')
WHEN MATCHED THEN
UPDATE SET R.PROMISED_BY = W.USER_ID, R.PROMISED_DATE=W.CREATED_ON; PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1259882673
--------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------------
| 0 | MERGE STATEMENT | | 3194 | 112K| | 56039 (1)| 00:11:13 |
| 1 | MERGE | GPRECL | | | | | |
| 2 | VIEW | | | | | | |
|* 3 | HASH JOIN | | 3194 | 1394K| 7760K| 56039 (1)| 00:11:13 |
| 4 | TABLE ACCESS BY INDEX ROWID | GPRECL | 19278 | 7530K| | 9334 (1)| 00:01:53 |
|* 5 | INDEX RANGE SCAN | GPRCL_PROMISED_CUST_TRAN | 19278 | | | 103 (0)| 00:00:02 |
|* 6 | VIEW | | 338K| 15M| | 45379 (1)| 00:09:05 |
|* 7 | WINDOW SORT PUSHED RANK | | 338K| 27M| 33M| 45379 (1)| 00:09:05 |
| 8 | NESTED LOOPS | | 338K| 27M| | 38703 (1)| 00:07:45 |
|* 9 | INDEX RANGE SCAN | GPRCL_PROMISED_CUST_TRAN | 19278 | 602K| | 103 (0)| 00:00:02 |
|* 10 | TABLE ACCESS BY INDEX ROWID| GPACTV | 18 | 954 | | 3 (0)| 00:00:01 |
|* 11 | INDEX RANGE SCAN | GPACTV_CUSTNO_TRUNC_ACTVDATE | 1 | | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("T"."ID"="R".ROWID)
5 - access("R"."PROMISED"='Y')
6 - filter("T"."RN"=1)
7 - filter(ROW_NUMBER() OVER ( PARTITION BY "A"."CUSTNO" ORDER BY INTERNAL_FUNCTION("A"."ACTIVITY_ID") DESC)<=1)
9 - access("RL"."PROMISED"='Y')
10 - filter(TRUNC(INTERNAL_FUNCTION("ACTVDATE"))<=TRUNC(INTERNAL_FUNCTION("RL"."RCLDATE")) AND "A"."ACTVDATE"<"RL"."RCLDATE")
11 - access("A"."CUSTNO"="RL"."CUSTNO" AND TRUNC(INTERNAL_FUNCTION("ACTVDATE"),'fmddd')<=TRUNC(INTERNAL_FUNCTION("RL"."RCLDATE"),'fmddd'))

用Merge来改写相关更新的例子的更多相关文章

  1. mysql联合查询更新数据库例子

    mysql联合查询更新数据库例子,用户表,部门表,把用户表中的部门属性更新为部门表的主键UPDATE user_table AS utINNER JOIN belongdept AS bd ON bd ...

  2. Microsoft Dynamics CRM 2013 的相关更新 2013-12

        DCRM 2013已经发布一段时间了,很多同学都在学习实践中.     截至目前,已经有了一些相关的更新,具体内容,可以参见web Page:http://blogs.msdn.com/b/c ...

  3. PLSQL_性能优化系列17_Oracle Merge Into和Update更新效率

    2015-05-21 Created By BaoXinjian 一.摘要 以前只考虑 merge into 只是在特定场合下方便才使用的,今天才发现,merge into 竟然会比 update 在 ...

  4. 利用Merge into 改写Update SQL 一例

    前言 客户说,生产系统最近CPU使用率经常达到100%,请DBA帮忙调查一下. 根据客户提供的情况描述及对应时间段,我导出AWR,发现如下问题: 11v41vaj06pjd :每次执行消耗2,378, ...

  5. HOOK相关原理与例子

    消息HOOK 原理: 1. 用户输入消息,消息被放到系统消息队列. 2. 程序发生了某些需要获取输入的事件,就从系统消息队列拿出消息放到程序消息队列中. 3. 应用程序检测到有新的消息进入到程序消息队 ...

  6. cocos2d-x 2.2 资源更新AssetsManager例子代码

    转自:http://www.58player.com/blog-2327-601.html // // UpgradeLayer.h // AmazeDemo // // Created by lsw ...

  7. ORACLE 关连更新 update select

    总结:  关键的地方是where 语句的加入. 在11G中, 如果不加11G , 或造成除匹配的行数更新为相应的值之后, 其余的会变成负数. 所以, 测试的办法就是:  先查看需要更新的数量即连接的数 ...

  8. ORACLE 通过连接查询更新 update select

    注意:  关键的地方是where 语句的加入. 在11G中, 如果不加11G , 或造成除匹配的行数更新为相应的值之后, 其余的会变成负数. 所以,执行前需要测试, 普通办法就是:  先查看需要更新的 ...

  9. [转]oracle update set select from 关联更新

    本文转自:http://blog.csdn.net/disiwei1012/article/details/52589181 http://www.blogjava.net/Jhonney/archi ...

随机推荐

  1. 利用Queue队列实现FIFO的算法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  2. 3.使用OGG进程进行初始化数据

    开始初始化数据的时候要满足下面的条件: 1.disable掉目标段表的外键约束 2.disable掉目标端表的触发器 3.删除目标段表的索引,加快初始化速度 4.目标端表结构创建完成 源端配置初始化抽 ...

  3. x64内核内存空间结构

    0x00 前言 本文主要是讨论Windows 7 x64下的内核虚拟地址空间的结构,可以利用WiinDBG调试的扩展命令"!CMKD.kvas"来显示x64下的内核虚拟地址空间的整 ...

  4. MyBatis - MyBatis使用log4j2显示sql和结果集

    mybatis-config.xml <settings> <setting name="logImpl" value="LOG4J2" /& ...

  5. Rotate Image

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  6. Codeforces558E A Simple Task(线段树)

    题目 Source http://codeforces.com/problemset/problem/558/E Description This task is very simple. Given ...

  7. VR寒冬AR暖春,以色列AR公司再获3000万美元融资

    据统计,2015年国内至少有近70家VR公司获得天使或者A轮投资,不过狂欢并没有持续太久.2016年即将结束,资本寒冬和VR头盔的出货远不如预期,让投资者放慢了步伐,不过AR领域的热度依然不减.近日, ...

  8. 利用轮播原理结合hammer.js实现简洁的滑屏功能

    最近有个任务,做一个非常小的h5的应用,只有2屏,需要做横向的全屏滑动切换和一些简单的动画效果,之前做这种东西用的是fullpage.js和jquery,性能不是很好,于是就想自己动手弄一个简单的东西 ...

  9. 一些用过的我常忘记的小知识(web前端)

    背景图片固定:background-attachment:fixed 将图片的尺寸从中心点开始改变:backgroun-position:center   background-size: ** 旋转 ...

  10. 如何在Android中实现全屏,去掉标题栏效果

    在进行Android UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置.   1.在xml文件中进行配置   在项目的清单文件A ...