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,不太懂。)
as pubdate from TB_SHNEWS where barid='783' order by tsfpaixu,pubdate desc) where rownum<=6表里有17W条数据,感觉也不多啊,但查时却用近一秒或多,一个页面有好三四个版块,一起显示显得更慢,有什么办法快些吗? ORACLE数据库,只有NEWSID建了主键,(好像自己出了个关于主键的索引,PL/SQL,不太懂。)
以前是这么弄着的,现在要改,实际条数,没那么多,但我就是想知道,为什么我这条SQL这么慢。
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;
---加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 建索引
另外,你这里慢只要是排序比较慢.如果去掉排序就很快.你可以试图把排序放在外面一层.可能比较好.
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秒以上.希望帮到你们.