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