select vw013.ver,vw013.ACT,vw016.RN,vw016.RA,vw013.LS From vw016,vw013 WHERE vw013.ver = 0  and vw016.PROJ = vw013.PROJ  and 
 
 vw016.VER = vw013.VER  and vw016.ACT = vw013.ACT  and vw016.proj not like 'FCST_%'其中vw013表中有1千万条以上数据,vw016表中有500万以上的数据,有什么方法可以加快检索速度?两个表的proj、ver、act上都有索引

解决方案 »

  1.   

    select vw013.ver,vw013.ACT,vw016.RN,vw016.RA,vw013.LS 
    From vw016,vw013
    WHERE vw013.ver = 0  and vw016.PROJ = vw013.PROJ  and 
    vw016.VER = vw013.VER  and vw016.ACT = vw013.ACT  and substr(vw016.proj,1,5)<>'FCST_'去掉like 試試,不行再給vw016加上函數索引substr(vw016.proj,1,5)
      

  2.   

    提高查询效率方法很多
    可以先
    dbms_stats.gather_table_stats 下相应的表,对相应表统计分析
    来提高关联速度和数据存取
    尽量不要使用 not like 在查询时CBO会停用索引的
    改成 like 'XXX' or like 'XXX'
    假如值多的话,只能 按照LS的建立函数索引
    不建议使用<>一样会停用索引的 改成如下
    substr(vw016.proj,1,5)<'FCST_' and substr(vw016.proj,1,5)>'FCST_'
      

  3.   

    FCST_后面跟的是年份,可能有很多年,如FCST_2005,FCST_2006....;我想取不是以FCST_开头的,不用not like能行吗
      

  4.   

    create index IDX_vw016 on vw016 (substr(proj,1,5))
      

  5.   

    substr(vw016.proj,1,5)<'FCST_' and substr(vw016.proj,1,5)>'FCST_'和substr(vw016.proj,1,5)<>'FCST_'一样吗?
      

  6.   

    运算一样啊
    可是oracle 在生成执行计划时处理不一样
      

  7.   

    onemetre(大大) ( ) 信誉:100    Blog   加为好友  2007-6-14 14:26:48  得分: 0  
     
     
       
    提高查询效率方法很多
    可以先
    dbms_stats.gather_table_stats 下相应的表,对相应表统计分析
    来提高关联速度和数据存取
    尽量不要使用 not like 在查询时CBO会停用索引的
    改成 like 'XXX' or like 'XXX'
    假如值多的话,只能 按照LS的建立函数索引
    不建议使用<>一样会停用索引的 改成如下
    substr(vw016.proj,1,5)<'FCST_' and substr(vw016.proj,1,5)>'FCST_'--------------------------------------------------------
    写错了!!!!
    substr(vw016.proj,1,5)<'FCST_' or substr(vw016.proj,1,5)>'FCST_'