我有两张表tab1,tab2
create table tab1(
a
b
)
create table tab2{
a
c)这两张表都在a上建主键索引两张表做关联的时候
select *
from tab1 v1,tab2 v2
where v1.a=v2.a
时候怎么只走其中的一个主键索引,另外一张表全表扫描
如果想两张表都走主键索引,应该怎么办!

解决方案 »

  1.   

    这跟表的数据量有关系,要看你使用哪种优化方式select /*+RULE*/ *
    from tab1 v1,tab2 v2
    where v1.a=v2.a
    这样看是否都走索引?
      

  2.   

    下面的语句会都走主键索引:
    select v1.a,v2.a
    from tab1 v1,tab2 v2
    where v1.a=v2.a或者select *
    from tab1 v1,tab2 v2
    where v1.a=v2.a and v1.a='???'
    问题是你本来就是全表join,反正要遍历,如果索引字段不能满足select 所需要字段的要求,遍历索引不如遍历表
      

  3.   

    select v1.a,v2.a
    from tab1 v1,tab2 v2
    where v1.a=v2.a
      

  4.   

    当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录.如果不同表中两个想同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率先使用. FROM子句中最后的表的索引将有最高的优先级.