需求:

  小表数据量20w条左右,大表数据量在4kw条左右,需要根据大表筛选出150w条左右的数据并关联更新小表中5k左右的数据。

性能问题:

对筛选条件中涉及的字段加index后,如下常规的update语句仍耗时半小时左右。

  UPDATE WMOCDCREPORT.DM_WM_TRADINGALL A
SET
(
A.RELATIONSHIPNO,
A.PACKAGE
)
=
(SELECT
B.RELATIONSHIPNO,
CASE
WHEN (B.SEGMENTCODE=''
OR B.SEGMENTCODE =''
OR B.SEGMENTCODE =''
OR B.SEGMENTCODE ='')
THEN 'BC'
WHEN (B.SEGMENTCODE='')
THEN 'PW'
WHEN (B.SEGMENTCODE='')
THEN 'MM'
WHEN (B.SEGMENTCODE='')
THEN 'EB'
WHEN (B.SEGMENTCODE='')
THEN 'PB'
ELSE B.SEGMENTCODE
END
FROM DATACORE.DF_CUST_HISTORY B
WHERE B.ACCOUNT_NO=A.SETTLEMENTACCOUNT
AND B.DATA_DATE = '2018-11-30'
AND rownum = 1
)
WHERE A.MONTH = 'SEP'
AND A.DATA_DATE = '2018-09-30'
AND EXISTS
(
SELECT 1 FROM DATACORE.DF_CUST_HISTORY C
WHERE C.ACCOUNT_NO=A.SETTLEMENTACCOUNT
AND C.DATA_DATE = '2018-11-30'
);

经过数次搜索,发现同关联更新有关的技术博客基本上是更新大表数据,比如here.(使用批量更新)。

也分析过执行计划,同预想的性能瓶颈一样,主要由以下两个方面造成

(1) DATACORE.DF_CUST_HISTORY数据量太大,本想将某一天的数据select出来提前插入到一张表中,但估计效果不会太明显,因为插入150w条数据本身也会耗时很长。

(2) 需要更新5k条数据,且每条数据需要到150w条数据中做关联查询(时间主要耗在这)。

性能优化:

小表5k,大表150w,理所应当想到采用join的方式并保留小表中的数据。接下来是怎么把join后的数据更新到小表中(不用update)?merge into!

这里还涉及到一个小问题,merge into中的on条件需要保证一一对应,而大表中很可能出现重复的ACCOUNT_NO,所以需要排重,怎么做?用partition by !

另外,关于join中on条件和where条件的比较

优化后的sql(运行时间8-10s):

merge into wmocdcreport.dm_wm_tradingall a
using (
select
t.rid,
t.settlementaccount,
tx.relationshipno,
case
when (tx.segmentcode = '' or tx.segmentcode = '' or
tx.segmentcode = '' or tx.segmentcode = '') then
'BC'
when (tx.segmentcode = '') then
'PW'
when (tx.segmentcode = '') then
'MM'
when (tx.segmentcode = '') then
'EB'
when (tx.segmentcode = '') then
'PB'
else
tx.segmentcode
end as package
from (
select rowid rid,
dwt.settlementaccount
from wmocdcreport.dm_wm_tradingall dwt
where dwt.month = 'SEP'
and dwt.data_date = '2018-09-30'
) t
inner join
(
select row_number() over (partition by c.account_no order by c.relationshipno) seq,
c.account_no,
c.relationshipno,
c.segmentcode
from datacore.df_cust_history c
where c.data_date = '2018-11-30'
) tx
on tx.account_no = t.settlementaccount and tx.seq = 1
) b on (a.rowid = b.rid)
when matched then
update set a.relationshipno = b.relationshipno,
a.package = b.package;

Oracle SQL性能优化 - 根据大表关联更新小表的更多相关文章

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

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

  2. Oracle SQL 性能优化技巧

    Select语句完整的执行顺序: SQL Select语句完整的执行顺序: 1. from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将 ...

  3. ORACLE SQL性能优化(全)

    ORACLE SQL性能优化(全) http://wenku.baidu.com/view/b2aaba3887c24028915fc337.html

  4. Oracle SQL性能优化

    (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table) ...

  5. Oracle SQL性能优化(转)

    (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table ...

  6. <转>Oracle SQL性能优化

    原文链接:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效 ...

  7. oracle sql 性能 优化

    目录[-] (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table ...

  8. [转]Oracle SQL性能优化

    本文转自:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效 ...

  9. Oracle SQL性能优化总结

    1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...

随机推荐

  1. (一) Spring基础概述

    1.历史 第一阶段:xml配置 在Spring1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分布放到不同配置文件中,需要频繁的在开发的类和配置文 ...

  2. POJ3983 快算24

    很正常的题目,迷一样的答案. 测试数据只有一组,对没错只有一组. #include<cstdio> int main() { printf("5*(5-(1/5))\n" ...

  3. c语言中的rewind函数,Win CE 不支持,可用fseek函数替换

    FILE *read = fopen(cXmlFile,"rb"); if (read) { fseek(read, 0L, SEEK_END); int len = ftell( ...

  4. CC2540介绍

    1. 介绍 CC2540是一款2.4GHz Bluetooth® low energy SOC,基于8051 MCU 首先,你需要硬件设备 笔者的开发板为CC2540DK 得到开发板的同时应该还有TI ...

  5. hdu 1385(Floyed+打印路径好题)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  6. ViewAnimator实现复杂的动画效果

    咱们先看个原生的 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether( ObjectAnimator.ofFlo ...

  7. 笔记-迎难而上之Java基础进阶-终

    使用Stream流的方式,遍历集合 import java.util.*; public class StreamDemo{ public static void main(String[] args ...

  8. HTTP Range - [Web开发]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://minms.blogbus.com/logs/39569593.html 所谓 Range,是在 HTTP/1.1(htt ...

  9. Oracle rac配置Weblogic数据源(实例名及URL的选择)

    这几天,应用程序后台一直报无法取得连数据库接池.但之前从来没有这个问题,迁移到Weblogic后才发生. 之后据了解,我们服务器上的Oracle 10G 是 RAC 的,即有两个节点. 两个节点 IP ...

  10. ef SaveChanges()报"更新条目时出错,有关详细信息请参见内部异常"

    报这个错误是因为表没有设置主键,设完主键后再重新更新Entity,就可以添加了