优化笔记:pfyhparopenfundinfotest_D_20140916.gz
性能瓶颈在函数的乱用。原代码黄色部分。
12分钟->35秒
---------------------------------------------------------------------------------------------
1.对两个函数调用多次,而且两个函数之间还有调用关系。(优化器是可以自动把函数体拆出来,拼到主查询里面一起优化的。但是太复杂了它也蒙。)
IsSpecial和gettradedate函数都是从1010表拿数据。
IsSpecial 扫2次1010表
Gettradedate 扫1次1010表
而4603表有25万多数据,对这个查询用了2次IsSpecial 和3次 Gettradedate,最糟糕的情况对1010表的扫描次数大约25万*(2+3) =125万次
用with把1010逻辑提出来,然后通过cross join连接到主查询,只扫一次。
2.这个案例跟昨天那个代码结构相似,但是情况正好相反。
如果把or改成union,性能反而会变慢。(昨天的把or改成union性能会变快)
开始判断性能瓶颈的时候发生了点悲剧。4603表有25万的数据,唯一性索引在OB_OBJECT_ID上面(错看成在f1_4603上了,o(╯□╰)o),而我们需要的只有2500左右,而且与1090相连用的是f1_4603.
所以错认为了走4603的索引效率会变高。
其实这个案例,不管索引在OB_OBJECT_ID还是f1_4603上面都没有用。因为真正把数据从25万筛选成2500的条件是在f3_4603上面,而f3上面没有索引,所以必须全表扫描。
所以,如果把or改成了union,本来对4603表的全扫描只扫1次,就会变成2次,效率反而降低。(昨天的案例把or改为union,从1次全表扫描变为2次索引扫描,效率提升)。
3.其他相似子查询,可按之前的办法合并。
-------------------------------优化后代码----------------------------------------------
with td as
(select max(f1_1010) - min(f1_1010) special,
max(f1_1010) ed,
min(f1_1010) sd
from (select f1_1010
from wind.tb_object_1010
where f1_1010 < to_char(&PlanTime, 'yyyymmdd')
order by f1_1010 desc)
where rownum <= 2)
select *
from (Select case
when f16_1090 like '%!%' then
substr(f16_1090, 1, instr(f16_1090, '!') - 1)
else
F16_1090
end Zqdm,
case
when nvl(F6_4603, 0) = 0 then
nvl(F4_4603, 0)
else
nvl(F6_4603, 0)
end Net_value,
0 Begin_Net,
case
when nvl(f4_4603, 0) <> 0 then
nvl(nvl(F5_4603, f4_4603), 0)
when nvl(f4_4603, 0) = 0 then
nvl(F5_4603, 0)
end Total_net,
---除货币基金累计未公布时,取单位净值[20140507]
0 Adjust_net,
0 Adjust_Int,
Case
When exists (select '1'
from wind.tb_object_1101
where f14_1101 = f2_1090
and f13_1101 = f3_4603
and f15_1101 = 1) Then
'Y'
Else
'N'
End div_date,
F3_4603 data_date,
Case
When Exists (Select '1'
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603) Then
(Select f9_4521
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603)
When f5_1090 = '上海' Then
'H'
When f5_1090 = '深圳' Then
'S'
Else
'Y'
End market,
Case
When Exists (Select '1'
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603) Then
(Select f15_4521
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603)
ELSE
F100_1099
END fund_type,
(select (F5_1115 * 10000)
from wind.tb_object_1115 a
where f1_1115 = f2_1090
and a.f2_1115 = (Select Max(b.F2_1115)
From wind.tb_object_1115 b
Where a.f1_1115 = b.f1_1115
And b.f2_1115 <= F3_4603)) Total_amt,
Null As BataValue
From wind.tb_object_1090
inner join wind.tb_object_4603 b
on F1_4603 = f2_1090
inner join wind.tb_object_1099
on f1_1099 = F2_1090
cross join td
Where (f19_1090 = '0' or f18_1090 >= to_char(&PlanTime, 'yyyymmdd'))
and ((td.special = 1 and td.ed = F3_4603) or
(td.special != 1 and F3_4603 > td.sd and F3_4603 <= td.ed)))
where length(zqdm) <= 6
union all
Select case
when f16_1090 = 'TZ0001' then
'TZ0002'
when f16_1090 = 'TZ0002' then
'TZ0001'
---小写转大写---
elSe
UPPER(f16_1090)
end Zqdm,
nvl(F3_4141, 0) Net_value,
0 Begin_Net,
case
when exists (select '1'
from wind.tb_object_1744
where f1_1744 = f1_4141
and f6_1744 = '货币市场型') then
0
else
nvl(nvl(F4_4141, F3_4141), 0)
end Total_net,
0 Adjust_net,
0 Adjust_Int,
'N' div_date,
f2_4141 data_date,
'Y' market,
nvl((select case
when f6_1744 = '货币市场型' then
'货币型'
else
f6_1744
end
from wind.tb_object_1744
where f1_1744 = f1_4141
and f6_1744 < > 'FOF'),
'债券型') fund_type,
nvl((Select f7_1772
From wind.tb_object_1772 b
Where f1_1772 = f2_1090
And f2_1772 = (Select Max(f2_1772)
From wind.tb_object_1772
Where b.f1_1772 = f1_1772)),
0) Total_amt,
null BataValue
From wind.tb_object_1090, wind.tb_object_4141 a
Where f1_4141 = f2_1090
And f2_4141 = (Select Max(f1_0012)
From wind.tb_object_0012
Where f1_0012 < to_char(&PlanTime, 'yyyymmdd')
And f3_0012 = 'CN'
And f4_0012 = 1
And F2_0012 = 'SSE')
AND F4_1090 = 'LC'
union
Select F16_1090 Zqdm,
nvl(F4_1449, 0) Net_value,
1 Begin_Net,
0 Total_net,
0 Adjust_net,
0 Adjust_Int,
'N' div_date,
F2_1449 data_date,
Case
When f5_1090 = '上海' Then
'H'
When f5_1090 = '深圳' Then
'S'
Else
'Y'
End market,
case
when exists (select '1'
from wind.tb_object_1400
where f2_1400 = f2_1090
and f6_1400 = '1'
and f3_1400 = '2001010503') then
'QDII'
else
(select decode(F100_1099, '货币市场型', '货币型', f100_1099)
from wind.tb_object_1099
where f1_1099 = f2_1090)
end fund_type,
(select F5_1115 * 10000
from wind.tb_object_1115 b
where f1_1115 = f2_1090
And b.f2_1115 = (Select Max(F2_1115)
From wind.tb_object_1115
Where f1_1115 = f2_1090
And f2_1115 < = f6_1449)) Total_amt,
(SELECT F4_5052
FROM WIND.TB_OBJECT_5052
WHERE F3_5052 = '613007000'
AND F1_5052 = F2_1090
AND F2_5052 =
(SELECT MAX(F2_5052)
FROM WIND.TB_OBJECT_5052
WHERE F1_5052 = F2_1090
AND F3_5052 = '613007000'
AND F2_5052 <= TO_CHAR(&PlanTime, 'YYYYMMDD'))) BataValue
From wind.tb_object_1090, wind.tb_object_1449 a
Where F1_1449 = f2_1090
And f19_1090 = '0'
and length(f16_1090) < = 6
and F3_1449 =
(select max(F16_1101)
from wind.tb_object_1101
where F16_1101 <= to_char(&PlanTime, 'yyyymmdd'))
AND NOT EXISTS (SELECT '1 '
from WIND.TB_OBJECT_4603
WHERE F3_4603 = F2_1449
AND F1_4603 = F1_1449)
------------------------原代码-------------------------------------------------------------
函数1:
create or replace function wind.GetTradeDate(p_start varchar2,p_inc number) return varchar2 is
Result varchar2(10);
begin
if p_start is null then
return null;
end if;
if p_inc<0 then
select min(f1_1010) into Result
from (select f1_1010 from wind.tb_object_1010
where f1_1010<p_start order by f1_1010 desc)
where rownum<=abs(p_inc);
elsif p_inc>0 then
select max(f1_1010) into Result
from (select f1_1010 from wind.tb_object_1010
where f1_1010>p_start order by f1_1010)
where rownum<=abs(p_inc);
else
Result:=p_start;
end if;
return(Result);
end GetTradeDate;
函数2:
create or replace function wind.IsSpecial(strDate varchar2) return number is
lastTradeDay varchar2(8);
nCount number;
begin
lastTradeDay := gettradeDate(strDate,-1);
select count(1) into nCount
from wind.tb_object_1010
where f1_1010 = to_char((to_date(lastTradeDay,'yyyymmdd') -1),'yyyymmdd');
return 1 - nCount;
end;
select *
from (Select case
when f16_1090 like '%!%' then
substr(f16_1090, 1, instr(f16_1090, '!') - 1)
else
F16_1090
end Zqdm,
case
when nvl(F6_4603, 0) = 0 then
nvl(F4_4603, 0)
else
nvl(F6_4603, 0)
end Net_value,
0 Begin_Net,
case
when nvl(f4_4603, 0) <> 0 then
nvl(nvl(F5_4603, f4_4603), 0)
when nvl(f4_4603, 0) = 0 then
nvl(F5_4603, 0)
end Total_net,
---除货币基金累计未公布时,取单位净值[20140507]
0 Adjust_net,
0 Adjust_Int,
Case
When exists (select '1'
from wind.tb_object_1101
where f14_1101 = f2_1090
and f13_1101 = f3_4603
and f15_1101 = 1) Then
'Y'
Else
'N'
End div_date,
F3_4603 data_date,
Case
When Exists (Select '1'
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603) Then
(Select f9_4521
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603)
When f5_1090 = '上海' Then
'H'
When f5_1090 = '深圳' Then
'S'
Else
'Y'
End market,
Case
When Exists (Select '1'
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603) Then
(Select f15_4521
From Wind.tb_object_4521
Where f1_4521 = f16_1090
And f14_4521 = F3_4603)
ELSE
F100_1099
END fund_type,
(select (F5_1115 * 10000)
from wind.tb_object_1115 a
where f1_1115 = f2_1090
and a.f2_1115 = (Select Max(b.F2_1115)
From wind.tb_object_1115 b
Where a.f1_1115 = b.f1_1115
And b.f2_1115 <= F3_4603)) Total_amt,
Null As BataValue
From wind.tb_object_1090,
wind.tb_object_4603 b,
wind.tb_object_1099
Where F1_4603 = f2_1090
And f1_1099 = F2_1090
And (f19_1090 = '0' or f18_1090 >= to_char(&PlanTime, 'yyyymmdd'))
and (((IsSpecial(to_char(&PlanTime, 'yyyymmdd'))) = 0 and
gettradedate(to_char(&PlanTime, 'yyyymmdd'), -1) = F3_4603) or
(IsSpecial(to_char(&PlanTime, 'yyyymmdd')) = 1 and
F3_4603 >
gettradedate(gettradedate(to_char(&PlanTime, 'yyyymmdd'),
-1),
-1) and
F3_4603 <= gettradedate(to_char(&PlanTime, 'yyyymmdd'), -1))))
where length(zqdm) <= 6
union all
Select case
when f16_1090 = 'TZ0001' then
'TZ0002'
when f16_1090 = 'TZ0002' then
'TZ0001'
---小写转大写---
elSe
UPPER(f16_1090)
end Zqdm,
nvl(F3_4141, 0) Net_value,
0 Begin_Net,
case
when exists (select '1'
from wind.tb_object_1744
where f1_1744 = f1_4141
and f6_1744 = '货币市场型') then
0
else
nvl(nvl(F4_4141, F3_4141), 0)
end Total_net,
0 Adjust_net,
0 Adjust_Int,
'N' div_date,
f2_4141 data_date,
'Y' market,
nvl((select case
when f6_1744 = '货币市场型' then
'货币型'
else
f6_1744
end
from wind.tb_object_1744
where f1_1744 = f1_4141
and f6_1744 < > 'FOF'),
'债券型') fund_type,
nvl((Select f7_1772
From wind.tb_object_1772 b
Where f1_1772 = f2_1090
And f2_1772 = (Select Max(f2_1772)
From wind.tb_object_1772
Where b.f1_1772 = f1_1772)),
0) Total_amt,
null BataValue
From wind.tb_object_1090, wind.tb_object_4141 a
Where f1_4141 = f2_1090
And f2_4141 = (Select Max(f1_0012)
From wind.tb_object_0012
Where f1_0012 < to_char(&PlanTime, 'yyyymmdd')
And f3_0012 = 'CN'
And f4_0012 = 1
And F2_0012 = 'SSE')
AND F4_1090 = 'LC'
union
Select F16_1090 Zqdm,
nvl(F4_1449, 0) Net_value,
1 Begin_Net,
0 Total_net,
0 Adjust_net,
0 Adjust_Int,
'N' div_date,
F2_1449 data_date,
Case
When f5_1090 = '上海' Then
'H'
When f5_1090 = '深圳' Then
'S'
Else
'Y'
End market,
case
when exists (select '1'
from wind.tb_object_1400
where f2_1400 = f2_1090
and f6_1400 = '1'
and f3_1400 = '2001010503') then
'QDII'
else
(select decode(F100_1099, '货币市场型', '货币型', f100_1099)
from wind.tb_object_1099
where f1_1099 = f2_1090)
end fund_type,
(select F5_1115 * 10000
from wind.tb_object_1115 b
where f1_1115 = f2_1090
And b.f2_1115 = (Select Max(F2_1115)
From wind.tb_object_1115
Where f1_1115 = f2_1090
And f2_1115 < = f6_1449)) Total_amt,
(SELECT F4_5052
FROM WIND.TB_OBJECT_5052
WHERE F3_5052 = '613007000'
AND F1_5052 = F2_1090
AND F2_5052 =
(SELECT MAX(F2_5052)
FROM WIND.TB_OBJECT_5052
WHERE F1_5052 = F2_1090
AND F3_5052 = '613007000'
AND F2_5052 <= TO_CHAR(&PlanTime, 'YYYYMMDD'))) BataValue
From wind.tb_object_1090, wind.tb_object_1449 a
Where F1_1449 = f2_1090
And f19_1090 = '0'
and length(f16_1090) < = 6
and F3_1449 =
(select max(F16_1101)
from wind.tb_object_1101
where F16_1101 <= to_char(&PlanTime, 'yyyymmdd'))
AND NOT EXISTS (SELECT '1 '
from WIND.TB_OBJECT_4603
WHERE F3_4603 = F2_1449
AND F1_4603 = F1_1449)
优化笔记:pfyhparopenfundinfotest_D_20140916.gz的更多相关文章
- 优化笔记: jxrsfxrxx_D_20140916.gz
表的重复扫描. ----------------------------------想进一步研究,继续往下看------------------------------ 1. 所有相似 ...
- Android App性能优化笔记之一:性能优化是什么及为什么?
By Long Luo 周星驰的电影<功夫>里面借火云邪神之口说出了一句至理名言:“天下武功,唯快不破”. 在移动互联网时代,同样如此,留给一个公司的窗口往往只有很短的时间,如何把握住 ...
- (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...
- U3D开发性能优化笔记(待增加版本.x)
http://blog.csdn.net/kaitiren/article/details/45071997 此总结由自己经验及网上收集整理优化内容 包括: .代码方面: .函数使用方面: .ui注意 ...
- CMU Convex Optimization(凸优化)笔记1--凸集和凸函数
CMU凸优化笔记--凸集和凸函数 结束了一段时间的学习任务,于是打算做个总结.主要内容都是基于CMU的Ryan Tibshirani开设的Convex Optimization课程做的笔记.这里只摘了 ...
- 优化笔记:jsyhjkzqxx_D_20140916.gz
有几张表没有权限,所以跑不起来. 目测黄色部分比较坑爹,死了n多脑细胞才看懂,又死了n多脑细胞才改出来.对5034进行了2次扫描,并多次分组排序求和.(分组和排序算法相对来说比较耗性能) 改为只扫描一 ...
- 移动web性能优化笔记
移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化
- mysql系列十一、mysql优化笔记:表设计、sql优化、配置优化
可以从这些方面进行优化: 数据库(表)设计合理 SQL语句优化 数据库配置优化 系统层.硬件层优化 数据库设计 关系数据库三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非 ...
- nginx优化笔记(keepalive、https等)
一.nginx之tcp_nopush.tcp_nodelay.sendfile 1.TCP_NODELAY你怎么可以强制 socket 在它的缓冲区里发送数据?一个解决方案是 TCP 堆栈的 TCP_ ...
随机推荐
- vue中使用jquery插件
(1)使用npm下载安装依赖 直接npm install ‘插件名称’ --save 安装依赖 在main.js中引入插件的样式 在页面中直接使用 (2)直接将js文件引入到项目中 先将js文 ...
- vuex(三)actions
actions:既然mutations只能处理同步函数,我大js全靠‘异步回调’吃饭,怎么能没有异步,于是actions出现了... actions和mutations的区别 1.Acti ...
- freeradius连接mysql数据库慢
[环境说明] 服务器版本 redHat5.3 mysql版本 MySQL5.6.22 freeradius版本 2.1.12 [问题描述] 配置好freeradiu ...
- 动态样式语言Sass&Less介绍与区别
一. Sass/Scss&Less是什么? Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,语法跟css一样(但多了些功能),比css好写, ...
- puremvc源码阅读
1.mediator作为ui管理器,是设计成可以list多个notification 2.所有ui想要监听notification,都需要register到facade中 3.puremvc只负责消息 ...
- requestAnimationFrame 兼容不支持时的问题
(function() { var lastTime = 0; var vendors = ['ms', 'moz', 'webkit', 'o']; for (var x = 0; x < v ...
- 数字证书在web应用中实现登陆
1数字证书登录认证的优点 作为企业信息系统的第一道大门,身份认证是确保企业信息资源只能被合法用户所访问的重要保障. 传统的口令认证方式虽然简单,但是由于其易受到窃听.重放等攻击的安全缺陷,使其已无法满 ...
- Codeforces 633H Fibonacci-ish II【线段树】
LINK 题目大意 给你一个序列a,Q次询问,每次询问\([l,r]\) 把\([l,r]\)的数排序去重,得到序列b,f是斐波那契数列 求\(\sum_{b=1}^{len} b_if_i\) 思路 ...
- WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
不知从什么时候开始,头像流行使用圆形了,于是各个平台开始追逐显示圆形裁剪图像的技术.WPF 作为一个优秀的 UI 框架,当然有其内建的机制支持这种圆形裁剪. 不过,内建的机制仅支持画刷,而如果被裁剪的 ...
- css table 布局 与 JavaScript 指定区域打印功能
<!DOCTYPE html> <html lang="en"><head> <meta http-equiv="conte ...