语句:
select p.ACC_NBR, z.QUDAO_TYPE
from phs_arpu p, lbas.zzp_97 z
where p.ACC_NBR=z.ACC_NBR索引:
phs_arpu_acc
zzp_97_acc执行计划:
Operation Object   Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=CHOOSE 72 K   987  
  HASH JOIN 72 K 1 M 987 
    INDEX FAST FULL SCAN MZZJM.PHS_ARPU_ACC          72 K 710 K 4
    TABLE ACCESS FULL LBAS.ZZP_97 905 K 8 M 455

解决方案 »

  1.   

    如果lbas.zzp_97中按照那个条件匹配到的记录很多(如超过10%),那么使用上面的执行计划是最优的。
      

  2.   

    你可以用 /*+INDEX()*/ 提示来强制使用索引对用不用索引两种情况都看看执行计划,或者干脆粗略地用执行时间判定那种更好。
      

  3.   

    从 HASH JOIN来看,你两个表返回的数据都比较大,在这个时候用hash join比nest loop效果要好,而merge join一般是连接的两个表都没索引才用到.
    索引不一定比full table scan要好,oracle会根据数据分布,返回数据量来评估成本,谁的成本低就使用哪个.
    比如你要查询表60%的数据,肯定走索引慢.
      

  4.   

    这个和RBO, CBO,oracle的优化机制有关。搂住可以参考这方面的文档。
    好像和init.ora文件设置有关系。默认是选择CBO中执行计划里最快的。大数据量当然是hash join快。