最近遇到一个问题,需要对视图进行分页查询,但是查询的效率非常低,点击查询后根本就不动...
大家有没有能提高效率的好方法,
select *
  from (select rownum r, t.*
          from (select *
                  from v_all_subs a
                 where 1 = 1
                   and a.payuser like '139200000%'
                 order by a.productindex
) t
         where rownum <=10)
 where r>= 0;
v_all_subs是视图,数据量在500万以上,
如果单纯使用select *
                  from v_all_subs a
                 where 1 = 1
                   and a.payuser like '139200000%'
                 order by a.productindex查询速度还可以.
但一旦使用分页查询速度就会慢很多..
视图里也已经使用了索引.但是并没有提高多少效率...
请高手指点一下,大家讨论讨论也是好的,看有没有什么办法可以进行改进....

解决方案 »

  1.   

    先确保在基础表的payuser字段上建有索引,然后收集下统计信息,再试试下面这个sql。
    比如取5到10条记录:
    select v_all_subs.* 
    from( 
    select rid from (
    select rid,rownum rn
    from (
    select rowid rid
    from v_all_subs
    where payuser like '139200000%' 
    order by a.productindex)
    where rownum<=10)
    where rn>=5) t,v_all_subs
    where v_all_subs.rowid=t.rid;
      

  2.   

    select v_all_subs.*
      from (select rid
              from (select rid, rownum rn
                      from (select rowid rid
                              from v_all_subs
                             where payuser like '139200000%'
                             order by productindex)
                     where rownum <= 10)
             where rn >= 5) t,
           v_all_subs
     where v_all_subs.rowid = t.rid;数据库报错,"无法从含DISTINCT,GROUP BY 等子句的视图中选择ROWID"
      

  3.   

    忘了你用的是视图,不能用rowid。
    那你看能不能直接从基表查询。
      

  4.   

     v_all_subs是视图没有ROWID....
      

  5.   

    这个视图本身是通过DBLINK连接其他数据库中的视图获得的,其他的每个视图都是由多个表联合查询获取的.直接查基表话话会很繁琐。
    CREATE OR REPLACE VIEW v_all_subs AS  
    select *
      from  a,  b,  c,  d
      where a.index=b.index and a.cp=c.cp
    UNION
    SELECT a.*  from  a,  b,  c,  d
      where a.index=b.index and a.cp=c.cp 
    UNION
    ...........
      

  6.   

    只执行下面的这个呢?速度如何?
    select rownum r, t.* 
              from (select * 
                      from v_all_subs a 
                    where 1 = 1 
                      and a.payuser like '139200000%' 
                    order by a.productindex) t 
            where rownum <=10