12
返回列表 发新帖
楼主: wzjbenq

WHERE 子句执行顺序的问题

[复制链接]
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
11#
发表于 2007-10-24 02:21 | 只看该作者
create table t as
select rownum as id1,a.* from dba_objects a ,dba_objects b where rownum<10000;

create index ind_id1 on T (id1);

analyze table COMMON.T compute statistics;

create table t2 as
select rownum as id2,a.* from dba_objects a ,dba_objects b where rownum<10000;

create index ind_id2 on T2 (id2);

analyze table COMMON.T2 compute statistics;

select *
  from t
where t.id1 in (select max(1)
                   from t2 t1, t2 t2,t2 t3
                  where rownum < 1
                    and t.owner = t1.owner)
   and t.id1 in (select max(1)
                   from t t1, t t2,t t3
                  where rownum < 40000000
                    and t.owner = t1.owner)

select *
  from t
where t.id1 in (select max(1)
                   from t t1, t t2, t t3
                  where rownum < 40000000
                    and t.owner = t1.owner)
   and t.id1 in (select max(1)
                   from t2 t1, t2 t2, t2 t3
                  where rownum < 1
                    and t.owner = t1.owner)

使用道具 举报

回复
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
12#
发表于 2007-10-24 02:23 | 只看该作者
再比较上面的两个sql有什么区别.

使用道具 举报

回复
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
13#
发表于 2007-10-24 02:28 | 只看该作者
再看以下两个语句的查询以及执行计划.
select *
   from t
  where t.id1 = 0
    and t.id1 in (select max(1)
                    from t t1, t t2, t t3
                   where rownum < 40000000
                     and t.owner = t1.owner)

select *
   from t
  where t.id1 in (select max(1)
                    from t t1, t t2, t t3
                   where rownum < 40000000
                     and t.owner = t1.owner)
    and t.id1 = 0

使用道具 举报

回复
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
14#
发表于 2007-10-24 02:31 | 只看该作者
再看一下的语句,ta,tb为故意写错的字段
select *
   from t
  where ta=1 and tb=1
错误提示首先提示ORA-00904: "TB": 无效的标识符

使用道具 举报

回复
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
15#
发表于 2007-10-24 02:37 | 只看该作者
一个语句被进行语法分析的时候是从右向左的.
解析通过后oracle的优化器分析我们语句.企图找出一个它认为高效的执行计划.
当直接指定and t.id1 = 0的时候oracle根据统计数据分析出该先进行索引的查找.
所以正确的安排了执行计划.当我们的过滤条件是复杂运算的结果集的时候,cbo失去了
自己的判断能力,他认为我们的两个条件是等效的,不做太多的执行计划顺序重排.
所以此时我们写的语句的顺序影响了执行计划.

使用道具 举报

回复
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
16#
发表于 2007-10-24 02:38 | 只看该作者
这是我的理解,可能不准确,也可能完全错误.仅供讨论.

使用道具 举报

回复
招聘 : 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#
发表于 2007-10-24 09:58 | 只看该作者
最初由 zhuojm 发布
[B]一个语句被进行语法分析的时候是从右向左的.
解析通过后oracle的优化器分析我们语句.企图找出一个它认为高效的执行计划.
当直接指定and t.id1 = 0的时候oracle根据统计数据分析出该先进行索引的查找.
所以正确的安排了执行计划.当我们的过滤条件是复杂运算的结果集的时候,cbo失去了
自己的判断能力,他认为我们的两个条件是等效的,不做太多的执行计划顺序重排.
所以此时我们写的语句的顺序影响了执行计划. [/B]

CBO还不够智能

使用道具 举报

回复
论坛徽章:
6
数据库板块每日发贴之星
日期:2007-10-22 01:03:12授权会员
日期:2007-10-27 02:59:26数据库板块每日发贴之星
日期:2007-10-28 01:03:53数据库板块每日发贴之星
日期:2007-10-29 01:03:40数据库板块每日发贴之星
日期:2007-11-09 01:04:25数据库板块每日发贴之星
日期:2007-11-15 01:05:05
18#
发表于 2007-10-24 20:42 | 只看该作者
永远不可能完全智能,不实际执行,就不会知道具体效率如何,如果实际执行再比较又没有意义了.
只能尽量让我们的统计数据准确,让cbo做出更合理一些的选择.

使用道具 举报

回复

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

本版积分规则 发表回复

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