总结:
在测试结果来看,采用第一种写法能比较获得较好执行的效率。
以下是测试的结果:
DROP TABLE TT PURGE;
CREATE TABLE TT AS SELECT * FROM DBA_OBJECTS;--创建表
DELETE TT WHERE OBJECT_ID IS NULL;
SELECT COUNT(*) FROM TT;--51784
INSERT INTO TT SELECT * FROM TT;
INSERT INTO TT SELECT * FROM TT;
INSERT INTO TT SELECT * FROM TT;
INSERT INTO TT SELECT * FROM TT;
INSERT INTO TT SELECT * FROM TT;
COMMIT;--共插入828544
CREATE INDEX IDX_TT_OBJECT_ID ON TT(OBJECT_ID);--创建索引
execute dbms_stats.gather_table_stats(ownname => 'ADMIN',tabname => 'TT');--收集统计信息
-----------------------------------------------------------------------------------------------------
以下是分页的几种方法
--1.
--执行时间: 00: 00: 05.02
/*
22857 consistent gets
10891 physical reads
*/
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TT ORDER BY OBJECT_ID) A WHERE ROWNUM <= 200000) WHERE RN >= 100000;
--2.
--执行时间: 00: 00: 17.90
/*
22857 consistent gets
34961 physical reads
*/
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TT ORDER BY OBJECT_ID) A ) WHERE RN BETWEEN 100000 AND 200000;
--3.
--执行时间: 00: 00: 06.04
/*22857 consistent gets
12081 physical reads*/
SELECT * FROM (SELECT TT.*, ROW_NUMBER() OVER(ORDER BY OBJECT_ID) ROWINDEX FROM TT) A WHERE ROWINDEX BETWEEN 100000 AND 200000;
--4.
--执行时间: 00: 00: 06.08
/* 122858 consistent gets
11962 physical reads*/
-- /*+ ORDERED USE_NL(P S) */
SELECT * FROM TT WHERE ROWID IN (SELECT RID FROM (SELECT ROWNUM RN, RID FROM (SELECT ROWID RID FROM TT ORDER BY OBJECT_ID)--ORDER BY SAL DESC WHERE ROWNUM <= 200000) WHERE RN >= 100000);
另外一个对分页在10g,11g下执行效率的分析帖子: