楼主: newkid

[精华] [翻译]Oracle中的增强子查询优化

[复制链接]
论坛徽章:
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
11#
发表于 2010-11-10 13:44 | 只看该作者
原帖由 jboracle1981 于 2010-11-10 10:46 发表
2.1的例子,下面两个查询应该不等价的吧???
Q2:
SELECT   o_orderpriority,   COUNT(*)
  FROM   orders
WHERE   o_orderdate   >=   '1993-07-01'   AND
         EXISTS   (SELECT   *
                     FROM   lineitem
                    WHERE   l_orderkey   =   o_orderkey   AND
                            l_returnflag   =   "R')  OR
         EXISTS   (SELECT   *
                     FROM   lineitem
                    WHERE   l_orderkey   =   o_orderkey   AND
                            l_receiptdate   > l_commitdate)
GROUP   BY   o_orderpriority;

我们的子查询合并会把两个EXISTS子查询并成单个带OR过滤谓词的子查询,变成Q3:

Q3
SELECT   o_orderpriority,   COUNT(*)
  FROM   orders
WHERE   o_orderdate   >=   '1993-07-01'   AND
         EXISTS   (SELECT   *
                     FROM   lineitem
                    WHERE   l_orderkey   =   o_orderkey   AND
                            (l_returnflag   =   "R'   OR
                             l_receiptdate   >   l_commitdate))
GROUP   BY   o_orderpriority;





绝对的相等, 其实就是通过改写减少对表lineitem的访问, 这篇文章主要就是讲通过re-write SQL 语句, 为了得到更好的性能!
另外, 我感觉非常奇怪的就是, 该文章中举的例子都是非常普遍的, 只要你有相关的经验, 你就能快速改写成功!
该作者写该文档的学术性语言描述太多了, 我简单的看了看, 写的太不通俗了, 还给出了不少的图片, 这也写的太麻烦了, 像在写学术性论文!
我觉得调优SQL语句最好的方法, 还是去研究执行计划和统计数据, 毕竟语句的执行性能最终取决的不是语句本身的写法, 而是optimizer给出的相应的执行计划和统计数据,  当然所有的前提都是建立在表的设计[这个项目的数据模型]本身就是非常合理, 否则希望通过对SQL语句的调优来大幅度的提高整体的应用程序的性能, 那时完全不可能的!



[ 本帖最后由 bell6248 于 2010-11-10 14:18 编辑 ]

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
12#
发表于 2010-11-10 14:09 | 只看该作者
呵呵,newkid老师真是好人啊。辛苦了!

我一直觉得Q2:o_orderdate   >=   '1993-07-01'   AND 后面少了个把两个exists括起来的“()”

[ 本帖最后由 jboracle1981 于 2010-11-10 14:11 编辑 ]

使用道具 举报

回复
论坛徽章:
32
奥运会纪念徽章:摔跤
日期:2012-08-23 11:03:05青年奥林匹克运动会-击剑
日期:2014-09-19 10:58:152014年世界杯参赛球队:巴西
日期:2014-07-07 12:19:232014年世界杯参赛球队: 瑞士
日期:2014-05-19 12:18:36马上有钱
日期:2014-04-08 12:12:232014年新春福章
日期:2014-04-04 14:20:47马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09红旗
日期:2014-02-14 15:15:55优秀写手
日期:2013-12-18 09:29:16
13#
发表于 2010-11-10 14:48 | 只看该作者
非常强悍!感谢newkid

使用道具 举报

回复
论坛徽章:
32
奥运会纪念徽章:摔跤
日期:2012-08-23 11:03:05青年奥林匹克运动会-击剑
日期:2014-09-19 10:58:152014年世界杯参赛球队:巴西
日期:2014-07-07 12:19:232014年世界杯参赛球队: 瑞士
日期:2014-05-19 12:18:36马上有钱
日期:2014-04-08 12:12:232014年新春福章
日期:2014-04-04 14:20:47马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09红旗
日期:2014-02-14 15:15:55优秀写手
日期:2013-12-18 09:29:16
14#
发表于 2010-11-10 14:53 | 只看该作者
原帖由 bell6248 于 2010-11-10 13:44 发表





绝对的相等, 其实就是通过改写减少对表lineitem的访问, 这篇文章主要就是讲通过re-write SQL 语句, 为了得到更好的性能!
另外, 我感觉非常奇怪的就是, 该文章中举的例子都是非常普遍的, 只要你有相关的经验, 你就能快速改写成功!
该作者写该文档的学术性语言描述太多了, 我简单的看了看, 写的太不通俗了, 还给出了不少的图片, 这也写的太麻烦了, 像在写学术性论文!
我觉得调优SQL语句最好的方法, 还是去研究执行计划和统计数据, 毕竟语句的执行性能最终取决的不是语句本身的写法, 而是optimizer给出的相应的执行计划和统计数据,  当然所有的前提都是建立在表的设计[这个项目的数据模型]本身就是非常合理, 否则希望通过对SQL语句的调优来大幅度的提高整体的应用程序的性能, 那时完全不可能的!



一半一半,我的感觉是。

使用道具 举报

回复
论坛徽章:
26
2010年世界杯参赛球队:智利
日期:2010-07-03 17:16:26比亚迪
日期:2014-01-16 17:12:41宝马
日期:2014-01-24 10:32:252014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上有对象
日期:2014-03-05 21:30:32马上有车
日期:2014-03-11 16:46:45优秀写手
日期:2014-03-25 05:59:50马上加薪
日期:2014-03-26 16:46:30问答徽章
日期:2014-05-09 16:40:36
15#
发表于 2010-11-10 15:50 | 只看该作者
mark,放在精华区就不怕找不到了

使用道具 举报

回复
招聘 : 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
16#
发表于 2010-11-10 16:03 | 只看该作者
原帖由 bell6248 于 2010-11-10 13:44 发表





绝对的相等, 其实就是通过改写减少对表lineitem的访问, 这篇文章主要就是讲通过re-write SQL 语句, 为了得到更好的性能!
另外, 我感觉非常奇怪的就是, 该文章中举的例子都是非常普遍的, 只要你有相关的经验, 你就能快速改写成功!
该作者写该文档的学术性语言描述太多了, 我简单的看了看, 写的太不通俗了, 还给出了不少的图片, 这也写的太麻烦了, 像在写学术性论文!
我觉得调优SQL语句最好的方法, 还是去研究执行计划和统计数据, 毕竟语句的执行性能最终取决的不是语句本身的写法, 而是optimizer给出的相应的执行计划和统计数据,  当然所有的前提都是建立在表的设计[这个项目的数据模型]本身就是非常合理, 否则希望通过对SQL语句的调优来大幅度的提高整体的应用程序的性能, 那时完全不可能的!


作者应该是站在研发人员的角度,从CBO作为一个软件产品在对子查询做优化时的设计的角度来写这篇文章的

使用道具 举报

回复
招聘 : 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
17#
发表于 2010-11-10 16:21 | 只看该作者
写这个的目的估计是述职报告、白皮书、专利申请等吧
不过对于我们来说可以用来借鉴在oracle早期版本中手工rewrite SQL以达到优化的目的

使用道具 举报

回复
论坛徽章:
97
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
18#
发表于 2010-11-10 16:31 | 只看该作者
好人啊。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
19#
 楼主| 发表于 2010-11-10 23:07 | 只看该作者
原帖由 bell6248 于 2010-11-10 13:44 发表





绝对的相等, 其实就是通过改写减少对表lineitem的访问, 这篇文章主要就是讲通过re-write SQL 语句, 为了得到更好的性能!
另外, 我感觉非常奇怪的就是, 该文章中举的例子都是非常普遍的, 只要你有相关的经验, 你就能快速改写成功!
该作者写该文档的学术性语言描述太多了, 我简单的看了看, 写的太不通俗了, 还给出了不少的图片, 这也写的太麻烦了, 像在写学术性论文!
我觉得调优SQL语句最好的方法, 还是去研究执行计划和统计数据, 毕竟语句的执行性能最终取决的不是语句本身的写法, 而是optimizer给出的相应的执行计划和统计数据,  当然所有的前提都是建立在表的设计[这个项目的数据模型]本身就是非常合理, 否则希望通过对SQL语句的调优来大幅度的提高整体的应用程序的性能, 那时完全不可能的!



呵呵,知道你人肉优化的厉害,其实我正是因为你的一个回帖才着手翻译这篇文章:
http://www.itpub.net/thread-1363559-1-1.html

那些例子很好,相当于总结了常见的转换方法,而文章的学术味确实较浓,不够通俗。以后看到这些术语不要被唬住,其实你都会的

上传的几个图都是关于并行执行的,有助于理解它的内部机制。当然这已经和编程没什么关系,了解一下即可。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
20#
 楼主| 发表于 2010-11-10 23:09 | 只看该作者
原帖由 jboracle1981 于 2010-11-10 14:09 发表
呵呵,newkid老师真是好人啊。辛苦了!

我一直觉得Q2:o_orderdate   >=   '1993-07-01'   AND 后面少了个把两个exists括起来的“()”


你眼神厉害,这确实是原文的错误,我已经改过来了。

使用道具 举报

回复

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

本版积分规则 发表回复

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