oracle分頁,後續將會繼續修改

absolute方式並不是好的Oracle分頁查詢方式

作者 Neot 寫於 2006-07-09 | 3,765 次瀏覽 | 分類 » 軟件開發 |

對Oracle查詢進行分頁時,很我開發人員都使用absolute方式進行分頁,在Google上搜的也大多是這種方法。代碼如下:

 int thepage=(currPage-1)*pageSize; ps = conn.prepareStatement(sqlquery, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rs = ps.executeQuery(); rs.absolute(thepage+1); long n = 0; while(n< pageSize && !rs.isAfterLast()){ … rs.next(); n++; } 

但是,這種方式並不是一個好的分頁方式。它先要取出所有的符合條件的記錄存入ResultSet對象,然後用absolute方法進行定位,來實現分頁。當記錄數較大(比如十萬條)時,整體的查詢速度將會變得很慢。很次要把大量的數據存入ResultSet對象中,也要消耗大量的內存。而且,上面的方法本身還存在問題:當記錄數爲0是會執行到”rs.next();”,從而產生異常。

真正有效的Oracle查詢分頁方式,應該是利用Oracle查詢語句自帶的關鍵字RowNum來實現。Hibernate的Oracle分頁方式就是用RowNum實現的。參考代碼如下:

public String createOraclePagingSql(String sql, int pageIndex, int pageSize){ int m = pageIndex * pageSize; int n = m + pageSize; return “select * from ( select row_.*, rownum rownum_ from ( ” + sql + ” ) row_ where rownum <= ” + n + “) where rownum_ > ” + m; }

用RowNum實現分頁,每次取出來的記錄數最多也只和pageSize一樣多,佔用內存少,查詢速度也快很多,萬級的數據分頁查詢瞬間就能完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章