Oracle 分页查询模板

Oracle分页查询方法一共有三种:

一、rowid效率最高

二、分析函数效率最差

三、ROWNUM

这里只说第三种,因为我认为第三种可读性比较高,效率也比较好,大约比第一种效率差一到二倍,和第二种相比快一个数量级。

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
WHERE ROWNUM <= 40
)
WHERE RN >= 21

这个SQL我们可以当一个模板,只需要修改table_name,40,21就可以了。

有几个要注意的地方说下:

①rownum<=40为什么不加上外层的>=21?大家可以试一下rownum<=40 and rownum>=21,是查不出结果的,在这一层select中rownum只能用一次;或者rownum<=40 and Rn>=21,内层循环不能识别RN;

②为什么不用betwwen?用 RN betwwen 21 and 40 效率比较低,内层循环返回给外层的都是全量数据,而第一种子查询是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了;

③这个可以当做模板,我们只需要修改内层循环就可以达到大部分的要求,例如换表只需要修改最内层子查询的表名,排序也只需要在最内层子查询加排序条件

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE2 order by column2 desc) A 
WHERE ROWNUM <= 40
)
WHERE RN >= 21


你可能感兴趣的:(oracle)