in 是不会使用索引的。
可以用
exists代替。
select * 
from b 
where exists (
select a2 from a  where a1 =89 and a.a2=b.b2);

解决方案 »

  1.   

    你使用的是CBO还是RBO,如果使用RBO的话,可能是优化器算法不能确认(select a2 from a where a1 = 89 ) 返回多少条记录,所以select * from b where b2 in ( ... )语句不用到索引。
      

  2.   

    我做了一下测试: fnd_user 表上user_id列上有唯一索引.
    SQL> SET AUTOTRACE ON
    SQL> SELECT * FROM FND_USER A WHERE A.USER_ID IN (1,2);
    .....
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=412)
       1    0   INLIST ITERATOR
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'FND_USER' (Cost=2 Card
              =2 Bytes=412)   3    2       INDEX (RANGE SCAN) OF 'FND_USER_U1' (UNIQUE) (Cost=1 C
              ard=2)Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              5  consistent gets
              2  physical reads
              0  redo size
           1475  bytes sent via SQL*Net to client
            309  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              2  rows processed一个表上有索引,如果你用索引的话,不管有多少条的数据,系统都会使用索引,当然,如果表的记录不是很多的话,建议在关联的时候不要使用小表的索引.
      

  3.   

    如果结果集很大的话,不用索引是正常的,如果结果集小的话,看你的表是否做过分析了?
    analyze table a1 compute statistics
    for table
    for all indexed columns
    for all indexes
    /