日期:2014-05-16  浏览次数:20403 次

oracle 高效分页

通常先排序再分页都是使用ROWNUM伪列,通过将查询结果先进行排序,再使用两层SQL将查询结果进行分页,例子如:

SELECT *
? FROM (SELECT ROWNUM row_, t.*
????????? FROM (SELECT?? *
??????????????????? FROM fltk
??????????????? ORDER BY ID) t
???????? WHERE ROWNUM < 10)
?WHERE row_ >= 0

还有一种排序分页的做法是使用分析函数ROW_NUMBER(),有人认为这种实现方法更加的高效。以下是SQL语句,实现的目标结果完全相同。

SELECT *
? FROM (SELECT ROW_NUMBER () OVER (ORDER BY ID) row_, fltk.*
????????? FROM fltk)
?WHERE row_ >= 0 AND row_ < 10;


?查询的数据量是100万条,最后的结果是使用ROWNUM来查询为16ms左右,而使用ROW_NUMBER()来进行查询需要1s,通过执行计划分析,ROWNUM中使用了索引,而ROW_NUMBER没有使用索引,这是导致两者性能差别最大的地方。

????? 然后使用没有索引的列进行排序,最后的结果是两者都需要1s,性能差异不大。

?