雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

Oracle高性能排序分页的方法

2024-08-03 45

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 即可得到想要的分页结果了。

更新于:3个月前
赞一波!

文章评论

评论问答