查看: 1984|回复: 5

请教SQL语句优化,给些建议

[复制链接]
论坛徽章:
15
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442014年新春福章
日期:2014-02-18 16:41:11ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28ITPUB元老
日期:2011-05-06 08:54:442011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010新春纪念徽章
日期:2010-03-01 11:04:59生肖徽章2007版:鼠
日期:2009-03-10 21:32:40生肖徽章2007版:猪
日期:2009-03-10 21:17:25CTO参与奖
日期:2009-01-15 11:42:46
发表于 2011-4-26 10:19 | 显示全部楼层 |阅读模式
SELECT 1, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 1 AND o_w_id = :w_id AND o_d_id = 1 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 2, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 2 AND o_w_id = :w_id AND o_d_id = 2 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 3, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 3 AND o_w_id = :w_id AND o_d_id = 3 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 4, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 4 AND o_w_id = :w_id AND o_d_id = 4 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 5, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 5 AND o_w_id = :w_id AND o_d_id = 5 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 6, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 6 AND o_w_id = :w_id AND o_d_id = 6 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 7, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 7 AND o_w_id = :w_id AND o_d_id = 7 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 8, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 8 AND o_w_id = :w_id AND o_d_id = 8 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 9, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 9 AND o_w_id = :w_id AND o_d_id = 9 AND o_id = no_o_id AND rownum <= 1 UNION ALL SELECT 10, no_o_id, C_New_Order.rowid, o_c_id, C_Order.rowid FROM C_New_Order, C_Order WHERE no_w_id = :w_id AND no_d_id = 10 AND o_w_id = :w_id AND o_d_id = 10 AND o_id = no_o_id AND rownum <= 1

我已经将C_NEW_order和表C_order建立了分区,列表分区,按照no_d_id和o_d_id,大家给些优化的建议,多谢

[ 本帖最后由 wysfenghuo007 于 2011-4-26 10:21 编辑 ]
招聘 : 数据库管理员
认证徽章
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
发表于 2011-4-26 10:27 | 显示全部楼层
lz先格式化一下  然后贴下执行计划

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2011-4-26 10:29 | 显示全部楼层
1、可以用case when去掉 union all
2、你给的信息不够。。。

使用道具 举报

回复
论坛徽章:
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
发表于 2011-4-26 12:20 | 显示全部楼层



LZ, 测试一下如下的语句执行的结果是否完全正确和等效, 再测试一下如下语句的性能如何!

select rownum rn,
       no_o_id,
       c_news_rid,
       o_c_id,
       c_order_rid
  from (select min(no_o_id) keep(dense_rank first order by rownum) no_o_id,
               min(C_New_Order.rowid) keep(dense_rank first order by rownum) c_news_rid,
               min(o_c_id) keep(dense_rank first order by rownum) o_c_id,
               min(C_Order.rowid) keep(dense_rank first order by rownum) c_order_rid
          from C_New_Order, C_Order
         where no_w_id = :w_id
           and no_d_id between 1 and 10
           and o_w_id = :w_id
           and o_d_id between 1 and 10
           and o_id = no_o_id
         group by no_d_id, o_d_id);


使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2011-4-26 13:20 | 显示全部楼层
原帖由 bell6248 于 2011-4-26 12:20 发表



LZ, 测试一下如下的语句执行的结果是否完全正确和等效, 再测试一下如下语句的性能如何!

select rownum rn,
       no_o_id,
       c_news_rid,
       o_c_id,
       c_order_rid
  from (select min(no_o_id) keep(dense_rank first order by rownum) no_o_id,
               min(C_New_Order.rowid) keep(dense_rank first order by rownum) c_news_rid,
               min(o_c_id) keep(dense_rank first order by rownum) o_c_id,
               min(C_Order.rowid) keep(dense_rank first order by rownum) c_order_rid
          from C_New_Order, C_Order
         where no_w_id = :w_id
           and no_d_id between 1 and 10
           and o_w_id = :w_id
           and o_d_id between 1 and 10
           and o_id = no_o_id
         group by no_d_id, o_d_id);



这个性能可能不如用rownum 利用stopkey算法,具体需要看执行计划,或许这个分析函数CBO也能用上stopkey

[ 本帖最后由 anlinew 于 2011-4-26 13:21 编辑 ]

使用道具 举报

回复
论坛徽章:
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
发表于 2011-4-26 13:44 | 显示全部楼层
原帖由 anlinew 于 2011-4-26 13:20 发表

这个性能可能不如用rownum 利用stopkey算法,具体需要看执行计划,或许这个分析函数CBO也能用上stopkey




确实是有可能的, 我觉得我的语句的产生的consistent gets数目很有可能和LZ的差不多, 但是我改写的语句的Cost会比LZ的小, 反正到底如何还要LZ测试了!


使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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