通用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; <span style="color:#ff0000;">--运行时间:1.981秒</span>
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; <span style="color:#ff0000;"> --运行时间:1.887秒</span>
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 <span style="color:#ff0000;">--运行时间:2.886秒</span>
从上述三个sql的我们能够发现:
(1) 不管用那种方式实现分页,都是要用到嵌套子查询的;
(2)查询所需字段是一般建议一一列出所需字段,而不是通过select * 的方式所有查出。这样会影响查询效率。
(3)採用ROWID分页查询效率相对较高,ROWNUM和分析函数分别次之。当然,对于数据量非常大的表。可能只通过上述方式是非常慢满足性能需求的。还需通过优化SQL或方法的完整索引。
版权声明:本文博客原创文章。博客,未经同意,不得转载。