我有一表,数据量上千万行。不用日期查询时,会很快。一用到日期,很慢。加过索引。我用三种方法测试,都慢:
 1.dtl.startday >= to_date('2009-01-01','yyyy-mm-dd')  AND dtl.startday <= to_date('2009-01-31','yyyy-mm-dd')
 2. dtl.startday between   '2009-01-01'   and  '2009-01-31'
 3.to_char(dtl.startday,'yyyy-mm-dd')>='2009-01-01' and to_char(dtl.startday,'yyyy-mm-dd')<='2009-01-31'请问还有什么办法?
 

解决方案 »

  1.   

    ...这个时间字段是date型的还是varchar2型的
    第一和第二个方法有一个会出错的吧
      

  2.   

    把时间条件用括号括起来,执行效率会提高
    如:(dtl.startday >= to_date('2009-01-01','yyyy-mm-dd')) ..... 
      

  3.   

    可以把时间存储的时候做一个转换,转换成int型的然后直接用int型做条件就快了!
      

  4.   

    楼主可以把时间字段 的类型改为 number行,及所谓的把时间 改为 UTC时间,可以提高下查询效率。eg:
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
    Connected as twc3_test
     
    SQL> SELECT SYSDATE, FUN_DATE2UTC(SYSDATE) FROM DUAL;
     
    SYSDATE     FUN_DATE2UTC(SYSDATE)
    ----------- ---------------------
    2009-11-10             1257846073
     
    SQL> FUN_DATE2UTC 为 一个 方法。
      

  5.   

    提高性能的方法关键在于索引的使用。你可以在这个表上建一个函数索引。因为尽管你在date上建立索引,但是一旦对这个列使用任何函数都不会再使用索引,所以即使你jian了索引实际上并没有用上。你可以尝试:
    这列假设表明是:table_test,可以向下面这样,你再试试看看速度是不是有所提高:
     create index index_date on table_test to_char(startday,'yyyy-mm-dd');
      

  6.   

    有没有index。 如果有index的话,1,2是可以用到index的。 3就不行了。2 要看日期的格式是不是这样的,如果是就不会错,Oracle会隐性的转换,如果不是这样的格式,就有错了。