開發過程中經常遇到分頁的需求,今天在此總結一下吧。
簡單說來方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁邏輯放在sql層;端上控制一次性獲取所有資料,把分頁邏輯放在ui上(如gridview)。顯然,端上控制開發難度低,適於小規模資料,但資料量增大時效能和io消耗無法接受;源上控制在效能和開發難度上較為平衡,適應大多數業務場景;除此之外,還可以根據客觀情況(效能要求,源與端的資源占用等)在源和端之間加一層,應用特殊演算法和技術進行處理。以下主要討論源上,即sql上的分頁。
分頁的問題其實就是在滿足條件的一堆有序資料中擷取當前所需要展示的那部分。實際上各種資料庫都考慮到分頁問題而內建了一些策略,比如mysql的limit,oracle的rownum和row_number(),sqlserver的top和row_number(),基於此我們可以得到一系列分頁的方法。
1、 基於mysql的limit和oracle的rownum,可以直接限制返回區間(以mysql為例,注意使用oracle的rownum時要應用子查詢):
方法
一、直接限制返回區間
select * from table where 查詢條件 order by 排序條件 limit ((頁碼-1)*頁大小),頁大小;優點:寫法簡單。
缺點:當頁碼和頁大小過大時,效能明顯下降。
適用:資料量不大。
2、基於limit(mysql)、rownum(oracle)和top(sqlserver),他們可以限制返回的行數,因此可以得到以下兩套通用的方法(以sqlserver為例):
方法二、not in
select top 頁大小 * from table where 主鍵 not in優點:通用性強。( select top (頁碼-1)*頁大小 主鍵 from table where 查詢條件 order by 排序條件
)order by 排序條件
缺點:當資料量較大時向後翻頁,not in中的資料過大會影響效能。
適用:資料量不大。
方法三、max
select top 頁大小 * from table where 查詢條件 and id >優點:速度快,特別是當id為主鍵時。( select isnull(max(id),0) from
(select top ((頁碼-1)*頁大小) id from table where 查詢條件 order by id
) as temptable
) order by id
缺點:適用面窄,要求排序條件單一且可比較。
適用:簡單排序(特殊情況也可嘗試轉換成類似可比較值處理)。
3、基於sqlserver和oracle的row_number(),可以得到返回資料的行號,基於此在限制返回區間得到如下方法(以sqlserver為例):
方法四、row_number()
select top 頁大小 * from優點:在資料量較大時相比not in有優勢。( select top (頁碼*頁大小) row_number() over (order by 排序條件) as rownum, * from table where 查詢條件
) as temptable
where rownum between (頁碼-1)*頁大小+1 and 頁碼*頁大小
order by rownum
缺點:小資料量時不如not in。
適用:大部分分頁查詢需求。
SQL分頁查詢總結 轉
開發過程中經常遇到分頁的需求,今天在此總結一下吧。簡單說來方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁邏輯放在sql層 端上控制一次性獲取所有資料,把分頁邏輯放在ui上 如gridview 顯然,端上控制開發難度低,適於小規模資料,但資料量增大時效能和io消耗無法接受 源上控制在效能和...
SQL分頁查詢總結
開發過程中經常遇到分頁的需求,今天在此總結一下吧。簡單說來方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁邏輯放在sql層 端上控制一次性獲取所有資料,把分頁邏輯放在ui上 如gridview 顯然,端上控制開發難度低,適於小規模資料,但資料量增大時效能和io消耗無法接受 源上控制在效能和...
SQL實現分頁查詢方法總結
開發過程中經常遇到分頁的需求,今天在此總結一下吧。簡單說來方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁邏輯放在sql層 端上控制一次性獲取所有資料,把分頁邏輯放在ui上 如gridview 顯然,端上控制開發難度低,適於小規模資料,但資料量增大時效能和io消耗無法接受 源上控制在效能和...