select DATA_ID,SUBJECT,CONTENT,CREATE_DATE,CREATE_DATEOTHER,CREATOR_ID,CREATOR_NAME,BACK_COUNT
        from ( select row_.*, rownum rownum_ from ( 
select DATA_ID,SUBJECT,CONTENT,to_char(CREATION_DATE,'YYYY-MM-DD HH24:MI') as        CREATE_DATEOTHER,CREATOR_ID,
  case
       when 'zh' = 'zh'
       then CREATOR_NAME
  else CREATOR_NAME_EN
  end
  as CREATOR_NAME,BACK_COUNT, 
                  nvl((select max(to_char(CREATION_DATE,'YYYY-MM-DD HH24:MI')) 
  from COM_FEEDBACK f where t.DATA_ID <> f.DATA_ID
                  connect by prior f.DATA_ID = f.PARENT_ID start with f.DATA_ID =t.DATA_ID) ,
                  to_char(CREATION_DATE,'YYYY-MM-DD HH24:MI'))
                  as CREATE_DATE
          from (select * from com_feedback  where creation_date > add_months(sysdate,-1)) t 
          where   ENABLED_FLAG = 'Y'
                  and parent_id = '-1'  order by CREATE_DATE desc) row_ where 1 = 1 and (            
          rownum <= 150  ))  这条sql 搜索大概2.5秒150条数据,使用很频繁,客户感觉慢。有优化的方案吗。 去掉红色部分只要0.5秒,但是又不得不用。   蓝色大概1万条数据。

解决方案 »

  1.   

    order by就是慢,没有办法的。
    你应该考虑的是去掉排序,然后在客户段代码排序。
      

  2.   

    索引是有的,  客户端排序指什么?
    我把 select * 替换成要的字段 提高了 0.5秒  
      

  3.   

    com_feedback表有多大?贴出那个SQL的执行计划
      

  4.   

    select * from com_feedback  where creation_date > add_months(sysdate,-1) and ENABLED_FLAG = 'Y' 
     and parent_id = '-1' 的记录又有多少?ENABLED_FLAG = 'Y' and parent_id = '-1'这两个条件是否固定的?
      

  5.   

    com_feedback大概50万数据, select * from com_feedback  where creation_date > add_months(sysdate,-1) and ENABLED_FLAG = 'Y' 
     and parent_id = '-1' 大概1万左右  ENABLED_FLAG = 'Y' and parent_id = '-1' 是固定的。
      

  6.   

    建一个(ENABLED_FLAG, parent_id, CREATE_DATE desc)的索引后再看看执行那个语句的速度如何
      

  7.   

    建一个(ENABLED_FLAG, parent_id, CREATE_DATE desc)的索引,然后在select中强制使用该索引,select /*+索引的名字*/ 字段名列表 from com_feedback  where creation_date > add_months(sysdate,-1) and ENABLED_FLAG = 'Y'  and parent_id = '-1'