原文出處:
分頁查詢語句:
select * from (
select a.*,rownum rn from (
select * from table table_name )a
where rownum <=40) where rn>=20;
最內層的查詢select * from table_name 表示不進行翻頁的原始查詢語句。rownu<=40和rn>=21 控制分頁查詢的每頁範圍。
分頁的目的就是控制輸出結果集大小,將結果盡快的返回,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的where ronum <= 40語句,在查詢的最外層控制分頁的最值和最大值,這是,查詢語句如下:
select * from ( select a.* ,rownum ru from ( select * from table_name) a ) where ru between 21 and 40
對比這兩種寫法,絕大數的情況下,第乙個查詢的效率比第二個高得多。
這是由於cbo優化模式下,
oracle
可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第乙個查詢語句,第二層的查詢條件where rownum<=40 就可以被oracle推入到內層查詢中,這樣oracle查詢的結果一旦超過了rownum限制條件,就將終止查詢結果返回。
而第二查詢語句,由於查詢條件between 21 and 40 是存在與查詢的第三層,而oracle無法將第三層的查詢條件推進到最內層(即使推進到最內層也沒有意義,因為最內層查詢不知道rn代表什麼)。因此,對於第二個查詢語句,oracle最內層返回給中層的是所有滿足條件的資料,而中間層返回給最外層也是所有的資料。資料的過慮在最外層完成,顯然這個效率要比第乙個查詢低得多!
上面的分析的查詢不僅僅是對單錶的簡單查詢,還是最內層查詢是複雜得多表聯合查詢後最內層查詢包含排列的情況一樣有效。
Oracle分頁技術詳解
分頁查詢語句 select from select a.rownum rn from select from table table name a where rownum 40 where rn 20 最內層的查詢select from table name 表示不進行翻頁的原始查詢語句。rown...
Oracle分頁技術詳解
分頁查詢語句 select from select a.rownum rn from select from table table name a where rownum 40 where rn 20 最內層的查詢select from table name 表示不進行翻頁的原始查詢語句。rown...
oracle分頁技術
分頁場景在現實生活中很常見,所以我們需要懂得如何利用sql語句實現資料的分頁檢索。步驟一 建立測試表 create table test datetime date,str varchar2 32 步驟二 插入測試資料 declare v1 date to date 20160801010000 y...