现有主从表定义如下主表名:A
字段定义:
AKEY   主键,主键索引
ANAME
ATM    升序索引子表名:B
字段定义:
BKey     主键,主键索引
BThread  外键,与A表的AKey进行关联,升序索引(在数据库中没有定义成外键)
BName现查询SQL语句如下:
第一种写法:
select A.AName,A.ATM,B.Name
from A,B
where A.Akey = B.BThread and A.ATM>to_date('2007-06-19 00:00:00','YYYY-MM-DD MM24:HH:SS')第二种写法:
select A.AName,A.ATM,B.Name
from A join B on A.Akey = B.BThread
where A.ATM>to_date('2007-06-19 00:00:00','YYYY-MM-DD MM24:HH:SS')第三种写法:
select B.* from B where B.BThread in (select A.Akey from A where A.ATM>to_date('2007-06-19 00:00:00','YYYY-MM-DD MM24:HH:SS'))通过查看执行计划发现执行是只使用了表A中的ATM的索引,而没有使用B表中的BThread索引。
而我的其它主从表与之不同之处就是外键名和主键名相同,其他都一样也没有见了外键关系,却可以使用从表的外键索引,百思不得其解。但是在上面的第一种和第二种写法的SQL语句上加上BThread的查询条件时,在执行计划是就使用了外键索引,SQL如下:
select A.AName,A.ATM,B.Name
from A,B
where A.Akey = B.BThread and A.ATM>to_date('2007-06-19 00:00:00','YYYY-MM-DD MM24:HH:SS')
and B.BThread='000000000000001'

解决方案 »

  1.   

    把B表放在A表前面就可以使用B表中的BThread索引
    如:select A.AName,A.ATM,B.Name
     /*把B表放在A表前面*/ from B,A    
       where A.Akey = B.BThread and A.ATM>to_date('2007-06-19 00:00:00','YYYY-MM-DD MM24:HH:SS')
      

  2.   

    to:xinyabin(辛雅斌) 
    您说的不对,和原先的结果一样。我想是因为Oracle在查询的时候已经做了优化处理,会现按主表索引查询的