方式1:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
方式2:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40
绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
对于第一个查询语句,第二层的查询条件就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件是存在于查询的最外层,而Oracle无法将最外层的查询条件推到最内层
因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。
数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。