返回

Oracle高性能排序分页的方法

2014-11-22 Oracle分页 Oracle排序分页 Oracle order by rownum 4534 0

Oracle数据库没有像MSSQL中的Top,所以分页需要使用rownum。

如果需要按某个字段排序后再分页,常常会出现分页混乱问题,因为排序后的rownum已经因为排序而被打乱了。

很多人会使用嵌套SQL语句的方法分页,效率极低,经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按该字段排序。

下面是一个分页的例子,分别列举了使用子查询低效率分页和高效分页:

select * from tabname where rownum<20 order by name

但却发现oracle却不能按自己的意愿来执行,而是先随便取20条记录,然后再 order by。原因是rownum是在orderby之前就已经产生了,orader by实际打乱了原先的rownum,所以取出来的不是自己想要的结果。

为了实现功能,我们可以用子查询:

select * from (select * from tabname order by name) where rownum<20

但这样一来,效率会较低很多。

正确的做法是:

在Name字段加上索引,然后再使用 select * from tabname where rownum<20 order by name 即可得到想要的分页结果了。

顶部