oracle中的分頁顯示

oracle中的分頁顯示一般我們在頁面上實現分頁顯示的時候都是採用的oracle提供的一個 rownum 來控制每頁顯示的行數的,一般的,我們要顯示結果集的前20行,可以用SQL表示爲: select * from service where rownum< 21 ; 同樣的,如果我們要顯示從20行到40行的數據時可能就會寫成: select * from service where rownum < 41 and rownum > 19; 如果做過這樣嘗試的人可能會知道,rownum是不能採用“>”符號的,這句SQL提交後不會報錯,但是返回不出結果集,因爲rownum並不是一個存儲在物理上的,而是根據用戶的查詢結果集自動生成的一個編號,總是從1開始的,所以oracle會認爲“ rownum > 一個數”是不存在的,也就沒有了結果集。同樣的,rownum只能採用<、<=進行篩選,而不能用>、>=、!= 和 between 的。理解了這些,我們再來討論“顯示從20行到40行的數據”這個問題,我們可以採用子查詢來解決rownum不能採用>的問題。所以我們可以採用多種方法來避開這個限制: 1)select * from ( select rownum rn ,a.* from service a ) where rn < 41 and rn > 19; 2)select rownum rn ,a.* from service a where rownum < 41 minus select rownum rn ,a.* from service a where rownum < 20 3)select * from ( select rownum rn ,a.* from service a where rownum < 41 ) where rn > 19; 對於第一種方法,沒有什麼可解釋的了,首先將整個表整個顯示出來,並且加上rownum,(就好像建立一張臨時表,在原表上增加rownum這個字段一樣),然後再在這個結果集中進行篩選,選出20~40行的數據。這是最簡單明瞭的寫法,但也是最慢的方法,因爲首先他會將service表中所有的數據都load到內存中,然後才根據rownum進行篩選。對於第二種方法,他是將最大值和最小值作爲兩個小於的條件,根據這兩個條件產生兩個結果集,也就是將最大值的結果集作爲被減數,將最小值的結果集作爲減數,【大結果集】- 【小結果集】的結果就是中間的那部分數據了。這要比第一種方法好了很多,至少他不會將service整個表的load到內存中。但是這個寫法也是有弊端的,例如service中有1000條記錄,我要查詢第950~1000行的數據,這個時候這種寫法就會首先將1000行數據load到數據庫中生成最大值結果集,然後再load前950行數據生成最小結果集,再minus,這樣算來,一共load了1950行的數據,就沒有第一種方法快了。其實最好的方法是第三種寫法,首先根據最大值的限制,在第一次load service的時候,就只拿到從1~最大值這些數據,然後生成一個帶 rownum 的結果集,然後在外部的查詢中將rownum小於最小值的數據剔掉。這樣就儘可能少的load了數據,就算象之前那個例子,此寫法也只load了1000行數據,與第一種寫法的cost是相等的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章