CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  基础和管理

关联查询语句怎么条件不同执行计划也不同呢?

楼主humanity(城市边缘的狼)2006-03-01 10:56:39 在 Oracle / 基础和管理 提问

1:Select   d.   *,   p.   *  
  From   Device   d,   Boiler   p  
    Where   d.Remark   =   0   And   d.Device_Id   =   p.Boiler_Id   And   p.Ratingpower   >=   1   And  
    p.Ratingpower   <=   99999  
   
  2:Select   d.   *,   p.   *  
  From   Device   d,   Boiler   p  
    Where   d.Remark   =   0   And   d.Device_Id   =   p.Boiler_Id   And   p.Ratingpower   >=   1    
   
  3:Select   d.   *,   p.   *  
  From   Device   d,   Boiler   p  
    Where   d.Remark   =   0   And   d.Device_Id   =   p.Boiler_Id   And  
    p.Ratingpower   <=   99999  
   
  这上面的语句,第一个语句执行计划和后面的不同,后面两个是一样的,  
  device   表约   33   万条数据,   boiler   月10万条,   这两个表一对一关联的。  
  执行时间     1   和   (   2   或   3   )   相差很远   ,1   一秒不到,   2   或   3   需要   10   秒。  
   
  ratingPower   列需要建索引么?   我的表还有很多字段需要建索引,ratingPower   字段不常用,  
  每个表最多能建多少几个索引有限制还是只看查询中能用到多少个索引有限制   ? 问题点数:100、回复次数:10Top

1 楼bzszp(SongZip)回复于 2006-03-01 11:00:39 得分 40

执行计划里面应该有,是否使用了索引,通过执行计划就能看出有什么不同,判断是否需要创建索引。  
   
  创建索引   可以加快查询效率,但是对于该表的增加修改删除操作回有负面影响。Top

2 楼humanity(城市边缘的狼)回复于 2006-03-01 11:08:28 得分 0

我这个字段不是很常用,  
   
  另外:   索引有个数限制么?   如果有的话,   是表上创建的总个数有限制,还是   查询时能用的个数有限制?  
   
  我上面的语句的条件不同,但是是同一个字段啊,  
  一个是   ratingPower     >   1   <   999,    
  另外的是    
      ratingPower   >1      
  和ratingPower   <   999  
   
  同时加上和只加一个怎么会有区别呢?我还是不明白为什么同一个字段上会因条件不同计划也不同?  
   
  Top

3 楼humanity(城市边缘的狼)回复于 2006-03-01 11:10:32 得分 0

补充,最后查询的结果是一样的。其实所有的记录的   ratingPower   其实都在   [1,999]   之间。Top

4 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-01 13:00:26 得分 30

你的优化模式是什么?是不是一个是table   full   scan一个是index   range   scan.Top

5 楼bzszp(SongZip)回复于 2006-03-01 14:18:34 得分 0

执行计划贴出来看看Top

6 楼ZengMuAnSha(曾牧暗鲨)回复于 2006-03-01 17:30:06 得分 0

你的機器配置不錯啊!!  
   
  d.Remark   =   0   是是否類型吧?  
   
  d.Device_Id   =   p.Boiler_Id   是關鍵字吧?  
   
  p.Ratingpower   >=   1   And   p.Ratingpower   <=   99999   是數字類型吧?  
   
  語句優化好象是     inne   jion         on       Device   id     Boiler_id  
  where   p.Ratingpower   <=   9999   and   d.Remark   =   0    
   
   
  Top

7 楼ZengMuAnSha(曾牧暗鲨)回复于 2006-03-01 17:32:29 得分 30

p.Ratingpower   看來不是有序類型的數字吧?  
   
  語句優化好象是     inne   jion         on       Device   id     Boiler_id  
  where   p.Ratingpower   <=   9999   andp.Ratingpower>=1   d.Remark   =   0    
   
  Oracle     比較笨         它要個變量綁定         你那三個語句不全部相同     所以執行計劃不能重用Top

8 楼humanity(城市边缘的狼)回复于 2006-03-02 08:54:31 得分 0

Remark   字段是删除标记很常用,所以建了索引。  
   
  以下是   PL/SQL   Developer   给出的:  
   
  A:  
  SELECT   STATEMENT,   GOAL   =   RULE  
    NESTED   LOOPS  
      TABLE   ACCESS   BY   INDEX   ROWID SCHEMAA DEVICE  
        INDEX   RANGE   SCAN SCHEMAA IN_DEVICE_REMARK  
      TABLE   ACCESS   BY   INDEX   ROWID SCHEMAA BOILER  
        INDEX   UNIQUE   SCAN SCHEMAA PK_BOILER  
   
   
  1.Select   d.   *,   p.   *   From   Device   d,   Boiler   p  
    Where   d.Remark   =   0   And   d.Device_Id   =   p.Boiler_Id   And   p.Ratingpower   >=   1   And  
    p.Ratingpower   <=   99999  
   
  执行计划显示:  
  列依次是     执行步骤描述,     ObjectOwner,   Object   Name,         Cost   ,   cardinality   ,   bytes.  
  GOAL   =first_rows   和   GOAL=all_Rows   一样的:    
   
  SELECT   STATEMENT,   GOAL   =   FIRST_ROWS 209 141 1213446  
    NESTED   LOOPS 209 141 1213446  
      TABLE   ACCESS   FULL SCHEMAA BOILER 68 141 1160289  
      TABLE   ACCESS   BY   INDEX   ROWID SCHEMAA DEVICE 1 1 377  
        INDEX   UNIQUE   SCAN SCHEMAA PK_DEVICE 3  
   
   
  2:     上面   2   ,3   语句的计划是一样的,  
  Select   d.   *,   p.   *   From   Device   d,   Boiler   p  
    Where   d.Remark   =   0   And   d.Device_Id   =   p.Boiler_Id   And   p.Ratingpower   >=   1    
   
  GOAL=first_rows   和   GOAL=all_rows   一样的.  
  列依次是:  
  执行步骤描述,     ObjectOwner,   Object   Name,Cost   ,   cardinality   ,   bytes.                
  SELECT   STATEMENT,   GOAL   =   FIRST_ROWS 1230.68689776287 2818 24251708  
    NESTED   LOOPS 1230.68689776287 2818 24251708  
      TABLE   ACCESS   FULL SCHEMAA BOILER 68 2818 23189322  
      TABLE   ACCESS   BY   INDEX   ROWID SCHEMAA DEVICE 1230.68689776287 1 377  
        BITMAP   CONVERSION   TO   ROWIDS  
          BITMAP   AND  
            BITMAP   CONVERSION   FROM   ROWIDS  
              INDEX   RANGE   SCAN SCHEMAA PK_DEVICE 3  
            BITMAP   CONVERSION   FROM   ROWIDS  
              INDEX   RANGE   SCAN SCHEMAA IN_DEVICE_REMARK 9 3  
   
   
  Top

9 楼humanity(城市边缘的狼)回复于 2006-03-02 08:56:57 得分 0

如果有优化办法的话我在   SQL   语句中要怎么告诉   Oracle   使用我期望的优化方案呢?Top

10 楼humanity(城市边缘的狼)回复于 2006-03-02 09:00:28 得分 0

看到数字的所有字段数据库里也全是   Number   型的。  
  remark   建了索引,   Device   ,   Boiler   主键的值是相同的,一对一关联。Top

相关问题

  • 多表关联查询语句
  • ADO不能执行Like查询语句????????
  • Ora-14551问题求助,怎么能在查询语句中执行DML语句
  • 关于外表关联查询语句的问题?
  • 关于外表关联的查询语句问题?
  • 请问这个关联查询地SQL语句怎样写?
  • 求助:两表关联的查询语句
  • 求关于两表关联查询、修改的语句
  • 请教一条关联查询语句的写法
  • 100分求SQL语句:多表关联查询,高手请进~

关键词

  • access
  • ratingpower
  • boiler
  • remark
  • device
  • goal
  • bitmap conversion
  • rowids
  • range
  • table access

得分解答快速导航

  • 帖主:humanity
  • bzszp
  • cenlmmx
  • ZengMuAnSha

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo