需求:

  小表数据量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. mysql安装配置、主从复制配置详解【转】

    仅限 centos7以下 版本 #yum install mysql #yum install mysql-server #yum install mysql-devel 启动服务 [root@loc ...

  2. Java数据结构-------Set

    三种常用Set:HashSet.LinkedHashSet.TreeSet set类继承关系: 概述 Set是对对应Map的一种封装,Set中的元素不可以重复. HashSet对应 HashMap.L ...

  3. BZOJ 3876 支线剧情

    支线剧情 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往都有很多的支线剧情,现在JYY想花费最 ...

  4. ckeditor编辑的使用方法

    一.下载安装Ckeditor,并将其整合到项目中 1.什么是CKeditor?为什么要使用它? 我们在做门户网站或者公文系统时,客户经常要求在录入时能够更改字体样式.大小.颜色并具备插入图片的功能.而 ...

  5. 对/proc和/sys的一些理解

    一切皆文件,设备(文件)可以通过读写来操作:/proc procfs:/sys sysfs: 个人的理解(不知对不对,感觉有些片面)/proc是内存中有关系统进程的实时信息:/sys是有关系统内核以及 ...

  6. python fromkeys的坑

    有个不定长的列表,想把列表中的每个值当做字典的key, 初始值为空列表,于是想到了fromkeys这个方法 In [337]: l = ['a','b','c'] In [338]: res = di ...

  7. 联通积分兑换的Q币怎么兑换到QQ上

    可登录联通积分商城http://jf.10010.com  查询和兑换Q币, 1,通过联通积分商城自主兑换,提交订单扣除积分成功后,10010端口将自动为您下发验证码短信. 2,在有效期内登陆Q币充值 ...

  8. AC日记——琪露诺 洛谷 P1725

    琪露诺 思路: 单调队列+dp: 然而劳资不会单调队列,所以,线段树水过; 来,上代码: #include <cstdio> #include <cstring> #inclu ...

  9. HDU 1269.迷宫城堡-Tarjan or 双向DFS

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. NOIP2016模拟赛三 Problem C: 不虚就是要AK

    题目大意 给定一棵带有边权的树, 问你在树上随机选两个点, 它们最短路径上的边权之和为\(4\)的倍数的概率为多少. Solution 树分治. 没什么好讲的. #include <cstdio ...