Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
连接到: 
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - ProductionSQL> set autotrace trace explain
SQL> select count(*) from sms_his_200310
  2  where pay_addr = '13051290000'
  3  /Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=11)
   1    0   SORT (AGGREGATE)
   2    1     INDEX (FAST FULL SCAN) OF 'SMS_HIS_200310_PAY_ADDR_IDX'
          (NON-UNIQUE) (Cost=4 Card=24127 Bytes=265397)
SQL> select * from sms_his_200310
  2  where pay_addr = '13051290000'
  3  /Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=7782 Card=24127 Byte
          s=5139051)   1    0   TABLE ACCESS (FULL) OF 'SMS_HIS_200310' (Cost=7782 Card=24
          127 Bytes=5139051)
SQL> 我不明白为什么第二次不用索引了!!!!
SP2-0734: 未知的命令开头 "我不明白为..." - 忽略了剩余的行。
SQL>

解决方案 »

  1.   

    这个不应该的,你可以将数据库重新analyst一下,以前我们也遇到过这样的问题,在上亿数量级的情况下,出现的问题很奇怪或者你可以在SQL语句中,指定使用索引!
      

  2.   

    SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 11月 17 15:52:41 2003Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    连接到: 
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - ProductionSQL> set autotrace trace explain
    SQL> select count(*) from sms_his_200309 where pay_addr='13051290000'
      2  /Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=11)
       1    0   SORT (AGGREGATE)
       2    1     INDEX (RANGE SCAN) OF 'SMS_HIS_200309_PAY_ADDR_IDX' (NON
              -UNIQUE) (Cost=1 Card=11 Bytes=121)
    SQL> select * from sms_his_200309 where pay_addr='13051290000'
      2  /Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=11 Bytes=2398
              )   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'SMS_HIS_200309' (Cost=2
              Card=11 Bytes=2398)   2    1     INDEX (RANGE SCAN) OF 'SMS_HIS_200309_PAY_ADDR_IDX' (NON
              -UNIQUE) (Cost=1 Card=11)
    SQL> 这是在别一台服务器上的结果有什么不一样吗?为什么这台服务器就可以用索引 
    SP2-0734: 未知的命令开头 "这是在别一..." - 忽略了剩余的行。
    SQL>
      

  3.   

    楼主重新分析一下数据库吧,统计信息不准确的话,会影响SQL的执行计划
      

  4.   

    强制指定hints:  select /*+ ALL_ROWS INDEX_RS(sms_his_200309) */
      from sms_his_200310 where pay_addr = '13051290000'  select /*+ FIRST_ROWS INDEX_RS(sms_his_200309) */
      from sms_his_200310 where pay_addr = '13051290000'
         
      看一下查询计划,如果cost比全表扫描高,则说明CBO
      的选择是对的.  BTW:     两台机器上执行相同的查询,得出的查询计划不同是很正常的.
        
        表和索引是否统计过,初始化参数文件中的相关参数是否相同 都会
        影响查询计划.
      
      

  5.   

    Sorry, 上面写的语句中漏写了 *
      
      select /*+ ALL_ROWS INDEX_RS(sms_his_200309) */ * 
        from sms_his_200310 where pay_addr = '13051290000'  select /*+ FIRST_ROWS INDEX_RS(sms_his_200309) */ *
       from sms_his_200310 where pay_addr = '13051290000'