两张表
A表结构
(CODE VARCHAR2(30) unique,
   .....
   ....)

B表结构
(CODE VARCHAR2(30) unique,
    ......
     .....),
都有300万条记录,
有unique约束的话,就自动在该字段上有个索引
SQL:
select * from A,B where A.code=B.code
对于这条sql得到的执行计划
hash join
   table access full      A
   table access full      B
问题:
都说索引对于表连接是起作用的,
可从这个执行计划看来,实在是看不出索引对于表连接的作用。
为什么?

解决方案 »

  1.   

    你这个SQL,把表A,B的数据都读出来了。索引只适合从表中取25%以下的数据,所以你的执行计划走hash full table scan是对的,用索引会更慢 
      

  2.   

    oracle自己选择了是否走索引(基于成本的优化器),可能是因为oracle自己认为全表扫描比走索引代价更低。
      

  3.   

    select /*+RULE*/ * from A,B where A.code=B.code;这样试试走不走索引
      

  4.   

    没有其它的在关键字上的WHERE条件肯定是的,因为都有300万,ORACLE认为你拿出了两个表大部分数据,索引还需要经过中间表提取,并树型查找ROWID后,才能定位数据,所以他会认为走全表扫描更加快。如果增加在关联字段上的WHERE条件,看条件情况,CBO自动分析;不过加上SELECT /*+rule*/* FROM ...强制走基于规则的优化器,的确在执行上讲,会走一条较好的路径,我想至少一张表会走索引的,一般会有一个驱动表,ORACLE一般会选择索引较好的为被驱动的表,而数据较小的为驱动表。不过,它的开销是主要是在尝试路径上,所以适当选择即可。