查看: 3181|回复: 15

[PL/SQL] 这样一句SQL,请大家帮忙优化一下

[复制链接]
论坛徽章:
51
蒙奇·D·路飞
日期:2017-12-13 16:57:22问答徽章
日期:2013-10-22 16:28:59大众
日期:2013-10-12 09:52:07红旗
日期:2013-09-11 12:25:22本田
日期:2013-08-30 15:30:10Jeep
日期:2013-08-28 10:20:34咸鸭蛋
日期:2013-04-12 11:24:162013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-22 14:08:04双黄蛋
日期:2013-01-09 14:03:02
发表于 2009-9-11 13:46 | 显示全部楼层 |阅读模式
今天这句sql执行很久,是开发给的,我没看得怎么懂,请高手帮忙看看,能不能做下优化。
代码如下:
_______________________________________________________________
select * from
(select ahh.codeids,sum(flag1) as sum1,sum(flag2) as sum2,sum(flag3) as sum3  
from(select ah.codeids,case when ah.sums>'0' and ah.sums<'0'  
then 1 else 0 end flag1,
case when ah.counts>'0' and ah.counts<'0'  then 1 else 0 end flag2,
case when ah.sums>'0' and ah.sums<'0' and ah.counts>'0' and ah.counts<'0'  
then 1 else 0 end flag3
from  (select dbc.broadband_account,
SUBSTR(dbc.code_id,0,8) as codeids,
sum(dof109.length) + sum(dof108.length) +
sum(dof107.length)+ sum(dof106.length) +
sum(dof105.length) + sum(dof104.length) +
sum(dof103.length) + sum(dof102.length) +
sum(dof101.length) + sum(dof012.length) +
sum(dof011.length) + sum(dof010.length) +
sum(dof009.length) + sum(dof008.length) +
sum(dof007.length) + sum(dof006.length) +
sum(dof005.length) + sum(dof004.length) +
sum(dof003.length) + sum(dof002.length) +
sum(dof001.length) + sum(dof112.length) +
sum(dof111.length) + sum(dof110.length) as sums,
count(dof109.INTERNET_ACCOUNT) + count(dof108.INTERNET_ACCOUNT) +
count(dof107.INTERNET_ACCOUNT) + count(dof106.INTERNET_ACCOUNT) +
count(dof105.INTERNET_ACCOUNT) + count(dof104.INTERNET_ACCOUNT) +
count(dof103.INTERNET_ACCOUNT) + count(dof102.INTERNET_ACCOUNT) +
count(dof101.INTERNET_ACCOUNT) + count(dof012.INTERNET_ACCOUNT) +
count(dof011.INTERNET_ACCOUNT) + count(dof010.INTERNET_ACCOUNT) +
count(dof009.INTERNET_ACCOUNT) + count(dof008.INTERNET_ACCOUNT) +
count(dof007.INTERNET_ACCOUNT) + count(dof006.INTERNET_ACCOUNT) +
count(dof005.INTERNET_ACCOUNT) + count(dof004.INTERNET_ACCOUNT) +
count(dof003.INTERNET_ACCOUNT) + count(dof002.INTERNET_ACCOUNT) +
count(dof001.INTERNET_ACCOUNT) + count(dof112.INTERNET_ACCOUNT) +
count(dof111.INTERNET_ACCOUNT) + count(dof110.INTERNET_ACCOUNT) as counts
from D_BROADBAND_CUSTOMER dbc,
d_original_file109 dof109, d_original_file108 dof108, d_original_file107 dof107,
d_original_file106 dof106, d_original_file105 dof105, d_original_file104 dof104,
d_original_file103 dof103, d_original_file102 dof102, d_original_file101 dof101,
d_original_file012 dof012, d_original_file011 dof011, d_original_file010 dof010,
d_original_file009 dof009, d_original_file008 dof008, d_original_file007 dof007,
d_original_file006 dof006, d_original_file005 dof005, d_original_file004 dof004,
d_original_file003 dof003, d_original_file002 dof002, d_original_file001 dof001,
d_original_file112 dof112, d_original_file111 dof111, d_original_file110 dof110
where 1=1  and
dbc.broadband_account=dof109.INTERNET_ACCOUNT and
dbc.broadband_account=dof108.INTERNET_ACCOUNT and
dbc.broadband_account=dof107.INTERNET_ACCOUNT and
dbc.broadband_account=dof106.INTERNET_ACCOUNT and
dbc.broadband_account=dof105.INTERNET_ACCOUNT and
dbc.broadband_account=dof104.INTERNET_ACCOUNT and
dbc.broadband_account=dof103.INTERNET_ACCOUNT and
dbc.broadband_account=dof102.INTERNET_ACCOUNT and
dbc.broadband_account=dof101.INTERNET_ACCOUNT and
dbc.broadband_account=dof012.INTERNET_ACCOUNT and
dbc.broadband_account=dof011.INTERNET_ACCOUNT and
dbc.broadband_account=dof010.INTERNET_ACCOUNT and
dbc.broadband_account=dof009.INTERNET_ACCOUNT and
dbc.broadband_account=dof008.INTERNET_ACCOUNT and
dbc.broadband_account=dof007.INTERNET_ACCOUNT and
dbc.broadband_account=dof006.INTERNET_ACCOUNT and
dbc.broadband_account=dof005.INTERNET_ACCOUNT and
dbc.broadband_account=dof004.INTERNET_ACCOUNT and
dbc.broadband_account=dof003.INTERNET_ACCOUNT and
dbc.broadband_account=dof002.INTERNET_ACCOUNT and
dbc.broadband_account=dof001.INTERNET_ACCOUNT and
dbc.broadband_account=dof112.INTERNET_ACCOUNT and
dbc.broadband_account=dof111.INTERNET_ACCOUNT and
dbc.broadband_account=dof110.INTERNET_ACCOUNT and
dof109.landing_time>=to_date('2007-09-11','yyyy-mm-dd')
and dof110.landing_time<=to_date('2009-09-11','yyyy-mm-dd')
group by dbc.broadband_account,SUBSTR(dbc.code_id,0,8)) ah) ahh  group by ahh.codeids) ahhh,
bms_code_son where PARENT_CODE='1001' and ahhh.codeids=son_code(+)


[ 本帖最后由 joebinl 于 2009-9-11 13:48 编辑 ]
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-9-11 13:48 | 显示全部楼层
牛,这是程序生成的sql吧

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-9-11 13:57 | 显示全部楼层

回复 #1 joebinl 的帖子

什么教能不能作优化? 你确定该语句在跑的执行计划是不最优化的?

使用道具 举报

回复
论坛徽章:
51
蒙奇·D·路飞
日期:2017-12-13 16:57:22问答徽章
日期:2013-10-22 16:28:59大众
日期:2013-10-12 09:52:07红旗
日期:2013-09-11 12:25:22本田
日期:2013-08-30 15:30:10Jeep
日期:2013-08-28 10:20:34咸鸭蛋
日期:2013-04-12 11:24:162013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-22 14:08:04双黄蛋
日期:2013-01-09 14:03:02
 楼主| 发表于 2009-9-11 14:05 | 显示全部楼层
原帖由 zergduan 于 2009-9-11 13:48 发表
牛,这是程序生成的sql吧

这个不太清楚。
问了下说是累计24个月符合条件的值,每月一张表。
已建议开发写存储过程了

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2009-9-11 14:23 | 显示全部楼层
其实语句到没有什么复杂的, 语句运行的时间长, 执行效率底的主要原因是参与连接的表的数量太多了!
首先是25个表的equal join, 并且按要求进行分组, 得到的结果在于另一个表进行outer join, 你可以通过执行计划分析一下!

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2009-9-11 14:26 | 显示全部楼层
从where 1=1 能看出来程序生成的SQL

使用道具 举报

回复
论坛徽章:
102
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2012-11-26 16:33:25慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:312016猴年福章
日期:2016-02-23 09:58:34
发表于 2009-9-11 14:43 | 显示全部楼层
关系应该很复杂吧

使用道具 举报

回复
认证徽章
论坛徽章:
89
生肖徽章2007版:鼠
日期:2009-03-10 21:19:05生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2009-10-14 09:31:39生肖徽章2007版:龙
日期:2009-03-10 21:14:14生肖徽章2007版:蛇
日期:2009-03-16 10:41:01生肖徽章2007版:马
日期:2009-10-21 16:45:13生肖徽章2007版:羊
日期:2009-03-24 07:32:42生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53
发表于 2009-9-11 14:46 | 显示全部楼层
我晕

使用道具 举报

回复
认证徽章
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
发表于 2009-9-11 15:07 | 显示全部楼层
关系很简单,你想象是一个partition table就是了。

执行计划怎么样?
如果是一大堆hash_join的话,那是正常的。
如果不是hash join, 就改成hash join吧~

使用道具 举报

回复
招聘 : 系统架构师
认证徽章
论坛徽章:
370
秀才
日期:2015-08-13 09:04:39巨蟹座
日期:2015-09-10 09:03:46秀才
日期:2015-09-11 10:43:06摩羯座
日期:2015-09-20 17:10:27秀才
日期:2015-09-21 09:46:16秀才
日期:2015-09-21 11:16:42秀才
日期:2015-10-08 17:57:58天枰座
日期:2015-10-28 18:28:29秀才
日期:2015-11-11 09:48:44巨蟹座
日期:2015-09-09 14:25:25
发表于 2009-9-11 15:11 | 显示全部楼层
如果自己知道什么执行方案最优还是直接hint吧,太复杂的连接,Oracle只研究前面5!(120)个...

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表