因为有了to_date 和between 速度会慢点的/
SELECT 
    * 
FROM 
    T_AG_RECORDFILE 
where 
        RECORDTIME >=to_date('2004-06-30 11:00:00','yyyy-mm-dd hh24:mi:ss') 
    and RECORDTIME <=to_date('2004-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')
    and rownum<=25
试一下看看.

解决方案 »

  1.   

    问题回答的没错,但可能没有理解到提问者的考虑点,呵呵
    zhenhuakfc (肯德基) 可能是这样认为的:SELECT * FROM T_AG_RECORDFILE where rownum<25 只要0.1秒左右,那么SELECT * FROM T_AG_RECORDFILE where rownum<25 and (RECORDTIME between to_date('2004-06-30 11:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2004-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))时间应该更短--因为还增加了限制条件。
      这种想法是错误的,oracle在对语句分析的时候,不可能把rownum<25作为首次filter条件,rownum本身就是一个伪列,必然是首先执行(RECORDTIME between to_date('2004-06-30 11:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2004-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))在此基础上进行rownum的判断,直到选中25条,由此会造成查询速度大为降低
      只能说
    SELECT * FROM T_AG_RECORDFILE where rownum<25 and (RECORDTIME between to_date('2004-06-30 11:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2004-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))要比
    SELECT * FROM T_AG_RECORDFILE where (RECORDTIME between to_date('2004-06-30 11:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2004-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))快而已
      

  2.   

    建个索引试试:
    create index idx_T_AG_RECORDFILE_RECORDTIME  on T_AG_RECORDFILE(RECORDTIME) compute statistics;