SQL> SELECT * FROM
2 (
3 SELECT A.*, ROWNUM RN
4 FROM (SELECT * FROM tab_test_1) A
5 )
6 WHERE RN BETWEEN 21 AND 40;
SQL分析:select * from table (目標表是:TAB_TEST_1)這個條件存在查詢的第三層,Orcale無法將第三層的查詢條件推到最內層,所以最內層和中間層返回的數據都是所有滿足條件的數據,數據過濾在外層才完成,效率明顯較低。
第二條分頁查詢SQL如下(產生右邊的執行計劃):
SQL> SELECT * FROM
2 (
3 SELECT A.*, ROWNUM RN
4 FROM (SELECT * FROM tab_test_1) A
5 WHERE ROWNUM <= 40
6 )
7 WHERE RN >= 21;
SQL分析:select * from table(目標表是:TAB_TEST_1)表示不進行分頁的原始語句, rownum >= 21 控制分頁查詢的每頁範圍。Orcale可以將外層查詢條件推到內層查詢中,提高查詢效率;所以 rownum <= 40 可以被推到內層查詢中,一旦Oracle查詢結果超過 rownum 限制條件,查詢結果就終止,所以此分頁查詢格式效率較高。
---------------------
原文:https://blog.csdn.net/seagal890/article/details/82828276