老聲常談,分頁查詢的實現就是不分頁

cats_tiger發表於2005-11-11
分頁查詢是經常遇到的問題,幾乎每個專案都會遇到,如此常見的問題,我們的資料庫卻沒有提供現成的解決方法,例如Oracle提供Rownum欄位,SQLServer提供TOP關鍵字,MySQL提供Limit關鍵字。Hibernate作為常用的ORM方案,也沒提供一個類似pageQuery之類的方法。他們都提供了分頁查詢的途徑卻沒有提供分頁查詢的直接實現。為什麼呢。
其實無論是TOP還是setMaxResults,都不是用於分頁查詢的,他們的目的在於透過限制抓取數量來提高查詢效能,Rownum也是如此,這就是為什麼Rownum在OrderBy之後就亂的原因(Oracle完全有能力讓它OrderBy之後仍然有序)。那麼我們怎麼還要分頁查詢呢?無非是兩個原因,其一是提高效能,其二是方便使用者使用――沒有哪個使用者會關心1000行之外的資料。
這樣就簡單了,我們不必費心如何高效而優雅的從資料庫中抓取某一頁資料,而是在查詢出所有資料(在maxResults限制下)之後,在記憶體中分頁。例如,List getUsers()獲取前1000個使用者――對於企業應用,這已經很多了――在返回的List中作分頁,即高效又簡單,而且如果加入快取機制之後,就不必每次翻頁都重新查詢了。
下面是示意類圖:

cats_tigeresV5bl0fFs.JPG

相關文章