常见的oracle分页查询实现方式有三种,分别是通过ROWNUM、ROWID、或分析函数实现,本文将以本人在项目中USER_INFO表的子表为例,简述三种分页的实现:
-- Create table
create table USER_INFO
(
USER_ID NUMBER(12) not null,
NAME VARCHAR2(30),
PET_NAME VARCHAR2(30),
HEAD_ICO VARCHAR2(255),
CREATE_DATE DATE not null
)1.根据ROWNUM分页
SELECT TT.*
FROM (SELECT ROWNUM RN, T.*
FROM (SELECT UI.USER_ID,
UI.NAME,
UI.PET_NAME,
UI.HEAD_ICO,
UI.CREATE_DATE
FROM USER_INFO UI
ORDER BY UI.CREATE_DATE DESC) T
WHERE ROWNUM < 600010) TT
WHERE TT.RN >= 600000;
--执行时间:1.981秒
2.根据ROWID分页
SELECT UI.USER_ID, UI.NAME, UI.PET_NAME, UI.HEAD_ICO, UI.CREATE_DATE
FROM USER_INFO UI
WHERE ROWID IN (SELECT RID
FROM (SELECT ROWNUM RN, RID
FROM (SELECT ROWID RID
FROM USER_INFO
ORDER BY CREATE_DATE DESC)
WHERE ROWNUM < 600010)
WHERE RN >= 600000)
ORDER BY UI.CREATE_DATE DESC;
--执行时间:1.887秒
3.根据分析函数分页
SELECT *
FROM (SELECT UI.USER_ID,
UI.NAME,
UI.PET_NAME,
UI.HEAD_ICO,
UI.CREATE_DATE,
ROW_NUMBER() OVER(ORDER BY UI.CREATE_DATE DESC) RK
FROM USER_INFO UI) T
WHERE T.RK < 600010
AND T.RK >= 600000
--执行时间:2.886秒
从上述三个sql的我们可以发现:
(1) 无论用那种方式实现分页,都是要用到嵌套子查询的;
(2)查询所需字段是一般建议一一列出所需字段,而不是通过select * 的方式全部查出,这样会影响查询效率;
(3)采用ROWID分页查询效率相对较高,ROWNUM和分析函数分别次之。当然,对于数据量很大的表,可能仅仅通过上述方式是很慢满足性能需求的,还需通过优化SQL化或建立索引的方式完善。
原文:http://blog.csdn.net/qubushangming/article/details/27789859