select t.* from (
     select r.*
     from repository r where tr.STATUS=1 order by r.UPDATE_TIME desc 
    )t where rownum<11 我的oracle版本是10.2.0.1,这是我写的取知识库有效信息的前10条最新更新记录的sql语句。数据量小的时候,很快,但是知识库信息表增长到上千万记录的时候,就会变得非常慢 了,这个问题如何结局呢?

解决方案 »

  1.   

    select *
    from repository r where tr.STATUS=1 and rownum<11 
     order by r.UPDATE_TIME desc 
     
      

  2.   

    在内Select中指定要查询的字段名称,不要让系统再自己查找字典。
      

  3.   


    不错,不过这个可能解决不了速度慢的问题,因为还是需要先把所有数据取出来然后再去前10条。不知道按照update_time字段进行时间分区的话,比如按照月分区的话,这样你查询的时候,基数据就少了些,速度应该会快些吧!但是这个分区不知道对你的业务逻辑时候会影响?如果影响大的话,就不划算了!没有 碰到过这样的问题,等待高人解决!
      

  4.   

    分区有用吗?楼主查的时候没有限制update_time的条件的
      

  5.   

    STATUS=1的记录有多少呢?如果这个数据量太大,单从查询是没法优化的。否则试试以下方法:
    1.create index ind_1 on repository(STATUS,UPDATE_TIME)2.exec dbms_stats.gather_table_stats(OWNER,TABNAME,cascade=>true)3.
    select /*+ ordered use_nl(t2,t)*/ t.* 
    from (
    select rid
    from (
    select rid,rownum rn
    from (
    select rowid rid
    from repository
    where STATUS=1 
    order by UPDATE_TIME desc))
    where rn<=10) t2,repository t
    where t2.rid=t.rowid;