我这里有个SQL语句Select 1
  from 
       fconsign       c,
       csubchargeitem s,
       ccustsuppview  csv,
       cuser          cu1,
       cuser          cu2,
       fexpense       e
 where (e.fexp_creator = ? or exists (select 1 from FCONSIGN f where e.FEXP_CONSIGN_ID=f.FCSG_CONSIGN_ID and f.FCSG_CREATOR = ?))
   and e.fexp_consign_id = c.fcsg_consign_id(+)
   and e.fexp_charge_id = s.csci_ci_id(+)
   and e.fexp_settlerment_object = csv.accountNumber(+)
   and c.fcsg_creator = cu1.cusr_user_id(+)
   and c.fcsg_canvasser = cu2.cusr_user_id(+)
   and e.fexp_org_id = ?
这个语句是不是没有办法避免fexpense表的全表扫描,因为我已经把where条件中用到fexpense的字段都分别做了索引,而且还对fexpense表做了analyse。哪位大侠能帮忙解决下

解决方案 »

  1.   

    --主表的SQL
    SELECT e.fexp_org_id
    FROM fexpense e
    WHERE e.fexp_org_id = :1
    AND (e.fexp_creator = :2 OR
          e.fexp_consign_id IN
          (SELECT fcsg_consign_id FROM fconsign WHERE fcsg_creator = :2))
      

  2.   

    to bugchen888(臭虫):用in替代exists不是会更慢吗,而且in肯定用不了索引的。
      

  3.   

    另外把那些e.的条件放到最接近WHERE的地方
      

  4.   

    to DragonBill(用户中文昵称------静观其变,以静制动) :or是不是没办法用到索引
      

  5.   

    在执行计划里:INDEX RANGE SCAN和INDEX UNIQUE SCAN是不是后者(主键扫描)速度要更快些,