absolute方式並不是好的Oracle分頁查詢方式
對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一樣多,佔用內存少,查詢速度也快很多,萬級的數據分頁查詢瞬間就能完成。