在oracle中建如下,
create table T_PLYWITHPHONE
(
  CALLID      VARCHAR2(20) not null,
  CALLERID    VARCHAR2(20) not null,
  CALLEEID    VARCHAR2(20) not null,
  PBTIME      TIMESTAMP(6) not null,
  PETIME      TIMESTAMP(6),
  ISGENCDR    NUMBER(2) not null,
  SERVICETYPE VARCHAR2(2) not null,
  REVERSE     VARCHAR2(20),
  TIMELENG    NUMBER(10)
);
我需要分页显示数据,比如9999995-10000000这最后五条记录
我自己建立如下存储过程,和索引,可查询速度仍然慢得死,求教优化方案?
我的方案如下:
   1。在原表基础上建索引:
    create index INDEX_T_PPHONE_CALLERID on T_PLYWITHPHONE (CALLERID);create index INDEX_T_PPHONE_PBTIME on T_PLYWITHPHONE (PBTIME);create index INDEX_T_PPHONE_PETIME on T_PLYWITHPHONE (PETIME);create index INDEX_T_PPHONE_ISGENCDR on T_PLYWITHPHONE (ISGENCDR);   2。我的查询语句:
    分页查询:
    select CALLERID,
       CALLEEID,
       to_char(PBTIME,
                'YYYY-MM-DD
HH24:MI:SS') PBTIME,
       to_char(PETIME, 'YYYY-MM-DD HH24:MI:SS') PETIME,
       TIMELENG,
       isGenCDR
  from (select rownum num,
               CALLERID,
               CALLEEID,
               PBTIME,
               PETIME,
               TIMELENG,
               isGenCDR
          from T_PLYWITHPHONE
         where 1 = 1) t
 where num >= 9999995  and num < 10000000       请问对于以上方案,查询居然需要135秒,太慢,可否提高查询速度了
请高速指教?      

解决方案 »

  1.   

    这样是用不上索引的,你至少要select * from (
    select   CALLERID, 
                  CALLEEID, 
                  to_char(PBTIME, 
                                    'YYYY-MM-DD 
    HH24:MI:SS')   PBTIME, 
                  to_char(PETIME,   'YYYY-MM-DD   HH24:MI:SS')   PETIME, 
                  TIMELENG, 
                  isGenCDR 
        from   (select            CALLERID, 
                                  CALLEEID, 
                                  PBTIME, 
                                  PETIME, 
                                  TIMELENG, 
                                  isGenCDR 
                        from   T_PLYWITHPHONE 
                      where   1   =   1
                     order by CALLERID )   t 
      where   rownum <   10000000 )
    where rownum > 9999995     
      

  2.   

    如果是这样,倒不如使用分析函数row_number来了.
      

  3.   

    以上SQL语句都没有使用到索引,导致查询比较慢,如果数据再比较多的话(>100w)
    那SQL的性能更不要说了,使用row_number也有问题,它会使用Win的内存。查询起来也要消耗很大资源。就该问题,最好的解决办法就是考虑换方案
      

  4.   

    運行這個語句看看 analyze table 表名 estimate statistics
      

  5.   

    如果只根据行row_number来选取记录 create的那些index都没啥用 
      

  6.   

    create index index_1 on T_PLYWITHPHONE(rownum) reverse
    也许你会有不一样的收获俄