select * from (select newsid,title,tsfpaixu,to_char(auditingdate,'YYYY-MM-DD HH24:MI:SS') 
as pubdate from TB_SHNEWS where barid='783' order by tsfpaixu,pubdate desc) where rownum<=6表里有17W条数据,感觉也不多啊,但查时却用近一秒或多,一个页面有好三四个版块,一起显示显得更慢,有什么办法快些吗? ORACLE数据库,只有NEWSID建了主键,(好像自己出了个关于主键的索引,PL/SQL,不太懂。)

解决方案 »

  1.   

    给barid建个索引,给tsfpaixu,pubdate 建个联合索引试试
      

  2.   

    barid建索引,并且如果to_char(auditingdate,'YYYY-MM-DD HH24:MI:SS')可以不转化格式尽量不要转化。
      

  3.   


    以前是这么弄着的,现在要改,实际条数,没那么多,但我就是想知道,为什么我这条SQL这么慢。
      

  4.   

    慢的一个原因是SQL里有计算 to_char(auditingdate,'YYYY-MM-DD HH24:MI:SS'),这个计算最好放到最外层。你再试试?
      

  5.   

    你这有to_char 和 order by 当然慢了。 发下执行计划看看 找出慢的原因看看时间主要是用在排序了还是其他的。
      

  6.   

    首先在barid上建立索引,然后执行以下SQL。select newsid,title,tsfpaixu,pubdate
      from (select newsid,
                   title,
                   tsfpaixu,
                   to_char(auditingdate, 'YYYY-MM-DD HH24:MI:SS') pubdate,
                   row_number()over(order by tsfpaixu, pubdate desc) rn
              from TB_SHNEWS
             where barid = '783'
           )
     where rn <= 6;
      

  7.   


    ---加hint  以及把to_char 放到外层,
    ---最好能在你程序里面来控制不要在数据库里面进行to_char
    select newsid,title,tsfpaixu, 
    to_char(auditingdate,'YYYY-MM-DD HH24:MI:SS') as pubdate 
    from (select /*index(TB_SHNEWS,主键索引) */ newsid,title,tsfpaixu,auditingdate
    from TB_SHNEWS where barid='783' order by tsfpaixu,pubdate desc) 
    where rownum<7
    ---tsfpaixu,pubdate 建索引  
      

  8.   

    选择SQL语句,在PL/SQL 里面按F5分析一下,是否使到索引.
    另外,你这里慢只要是排序比较慢.如果去掉排序就很快.你可以试图把排序放在外面一层.可能比较好.
    select * from (
    select * from (select newsid,title,tsfpaixu,to_char(auditingdate,'YYYY-MM-DD HH24:MI:SS')  
    as pubdate from TB_SHNEWS where barid='783' ) 
    order by tsfpaixu,pubdate desc )
    where rownum<=6如我个人理解是这样的.首先执行最小的子查询.再排序.这样排序遍历的内容比较少了.理论上是可以增加速度的.
    对于rownum 的使用一定要注意.一般采用这种方式rownum <= N 请不要使用某个rowrun区间.这样就算1千条数据.也很慢.要超过30秒以上.希望帮到你们.