方法一
方法二
方法一要比方法二效率要高很多,查询效率提高主要体现在WHERE ROWNUM <= 40这个语句上。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。方法一中,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
方法二中,由于查询条件30 < RN <=40 是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知都RN代表什么)。在方法二中,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,效率要比方法一要低得多。
注意
由于Oracle排序算法问题,如果排序遇到相同的条件,比如时间,会使分页后一页包含前一页的内容,所以这个时候要把方法改成下面这两种。
方法一,order by 加上id主键
方法二