Oracle 的分页查询,最常用的就是搭配ROWNUM来搞定。简单说,它能让你只取你想要那一段数据,比如只查第 21 到 40 条记录,性能还挺靠谱的。
用ROWNUM分页,逻辑上就是包三层查询。最里层拿全表或按条件查数据,中间加一列行号,外层再把你要的范围给筛出来。像下面这种写法,还是蛮经典的:
SELECT * FROM (
SELECT A.*, ROWNUM RN FROM (
SELECT * FROM TABLE_NAME
) A
) WHERE RN BETWEEN 21 AND 40;
你想问:为啥不直接用 ROWNUM BETWEEN
呢?嗯,在 Oracle 里,ROWNUM 是先生成的,所以你得先包一层,再筛。否则直接写 ROWNUM > 20
是没用的,因为前 20 条根本不会被赋值。
性能方面,记得加索引,是排序字段和关联字段。有时候你还可以用优化提示,比如加个 /*+ FIRST_ROWS */
,让 Oracle 优先返回前几条。像这样:
SELECT /*+ FIRST_ROWS */ * FROM (
SELECT A.*, ROWNUM RN FROM (
SELECT * FROM TABLE_NAME
) A
) WHERE RN BETWEEN 21 AND 40;
分页语句里还有一点比较容易踩坑的地方是:排序一定要加,不然每次跑出来的顺序都不一样。尤其是在做前端分页的时候,一页 20 条,你点上一页结果不对,那就难受了。
还有一个建议,数据量大时,不妨考虑主键范围分页,用主键或时间戳去做断点,不光快,还能避免重复数据或者跳页。
如果你想系统了解一下,也可以看看这个文章,讲得还蛮全的:Oracle SQL 语句分页查询全解。
如果你刚好在做老系统优化,或者在写个跑大表的后台管理,Oracle 分页真的是个绕不过去的坑。搞明白原理,再加点小技巧,速度会提升不少。