oracle下的兩種分頁方式適用場景

2021-09-01 20:03:56 字數 1227 閱讀 2961

首頁,筆者先把兩種最常用的oracle分頁方式sql語句貼出來,另外說明下筆者要查詢的表有2000多萬資料 

第一種:

select *  from  (select rownum a, articlew.xmldoc from articlew ) t                where t.a between 1 and 200 ;

第二種:

select *  from    (select rownum,  t.*   from    (select xmldoc from articlew) t   where t.rownum<=200)  where rownum >=1

近日,使用oracle資料庫時,需要從乙個千萬級的資料表裡面讀取資料,沒辦法了,只能寫分頁讀了,而且查詢欄位還涉及乙個blob型別的大字段,結果按照第一種分頁方式去讀,就一次取200條測試資料,結果發現資料庫一直在查詢,20多秒還沒返回結果,我想應該不是資料庫的問題,而是sql語句的問題了,於是換了第二種的分頁查詢,發現很快就能返回,對於第一種分頁查詢的方式,個人感覺內部可能做全表掃瞄了,所以就算分頁資料量很小,但只要資料量大的情況,其效能極為低下,因此只適合做小批資料量的分頁展示,而第二種分頁方式效能就高多了,尤其是在大資料量的表裡

這兩種寫法,大多數情況下,第二種都比第一種的效率高,為什麼? 

這是由於cbo優化模式下,oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第二個查詢語句,第二層的查詢條件where rownum <= 200就可以被oracle推入到內層查詢中,這樣oracle查詢的結果一旦超過了rownum限制條件,就立即終止查詢,僅僅把我們所需要的資料拿出來,是真正的按需所取。 

對於第乙個分頁查詢的語句,oracle內部,首先會做全表掃瞄,把所有符合條件的資料,全部返回,而真正的我們分頁所需要的資料,僅僅是在between 和and之後才進行過濾篩選的,所以,在資料量越大的情況下,第一種的分頁查詢的語句的效能就越低,這也就是為什麼我只取僅僅200資料,oracle竟然用20多秒都沒返回的原因。 

最後,對於上面的2種分頁方式,簡單總結一下,第一種:獲取全部,進行篩選,第二種:按需所取。舉個不太恰當的比方,就是有點像ejb跟spring的區別。

oracle分頁的兩種方式

方式一 select from select rownum r e.empno from select from emp order by sal desc e where r 5 and r 8 注 在oracle中rownum永遠是從1開始的,所以where條件不能 使用 比如 蓋8層樓,123...

java分頁的兩種方式

方式其實都非常的簡單,一種是資料庫分頁用limit限制取出條數,一種是在業務邏輯裡面分頁,我用的是jdbc,所以每次游標指定到一定的條數進行展示。因為只是簡單的進行原理學習,所以並沒有對 方面對嚴格的書寫,明白原理就好。主要的地方就是在進行資料庫查詢的時候,假設有一張表flownode,sql語句如...

LigerUI的兩種分頁方式

ligerui的分頁方式有兩種 local和server。如果資料量不是很大,就直接採用local分頁,一次性的把資料全部傳送到前台來,之後ligerui自身的grid會自動分頁。說一下total,在後台傳送jsonstring時傳送定義好的total 總條數 你可以定義多少都可以,但是到前台它會自...