SELECT (CASE
         WHEN COUNT(1) > 0 THEN
          'Y'
         ELSE
          'N'
       END) AS EXISTS_UNIMPORT_FEE
  FROM IFDPLINE IL
 WHERE IL.IFDL_ORG_ID = 139
   AND IL.IFDL_STATUS <> '03'
   AND IL.IFDL_GL_DATE >= TO_DATE('2007-9-1', 'yyyy-mm-dd')
   AND IL.IFDL_GL_DATE < TO_DATE('2007-10-1', 'yyyy-mm-dd')
   AND (IL.IFDL_DP_NUMBER LIKE '%/E' OR IL.IFDL_DP_NUMBER LIKE '%/I')IFDPLINE表的数据量是300W,现要取IFDL_DP_NUMBER的最后2位为/E或/I,IFDL_DP_NUMBER数据的位数不确定,有什么方法可以避免左模糊的全表扫描。(函数在索引列上也失效,所以用length也不行)

解决方案 »

  1.   

    AND (IL.IFDL_DP_NUMBER LIKE '%/E' OR IL.IFDL_DP_NUMBER LIKE '%/I')换成AND (instr(IL.IFDL_DP_NUMBER,'%/E') > 0 OR instr(IL.IFDL_DP_NUMBER,'%/I') > 0)
    试试看~~~
      

  2.   

    写快了 应该是:AND (instr(IL.IFDL_DP_NUMBER,'/E') > 0 OR instr(IL.IFDL_DP_NUMBER,'/I') > 0)
      

  3.   

    用了instr还是会使IFDL_DP_NUMBER列索引失效,试了下,效率还是一样,还有什么好的避免全表扫描的方法吗
      

  4.   

    就一个表而已,很简单.其实你最后求得只是一个count,没有其他任何的明细行数据,那么如果有那么一个索引能用上,甚至直接访问索引就行了,不需要访问表. 那么,你有索引包含条件中的那些列吗?如果没有索引,为了提高效率,可以在相关字段上建立索引,不过也要根据程序来建,不要一下子全把出现的字段给塞到索引中去了,也不要只包含过少的字段.
      

  5.   

    to kongkongye(飘流瓶) :现在关键是条件里有AND (IL.IFDL_DP_NUMBER LIKE '%/E' OR IL.IFDL_DP_NUMBER LIKE '%/I'),我就想看看能不能让IFDL_DP_NUMBER字段的索引用起来,因为口径就在这里