四種高效的SqlServer分頁方式

 當我們顯示列表信息的時候,我們常常以分頁形式顯示,當然在ASP.NET中的ListView和GridView控件等都自帶了分頁功能,但是效率很低,無法適用大量數據,並且靈活性不高。因而我們一般都使用第三方分頁控件或者自己編寫分頁程序。那麼在基於ADO.NET中實現自定義分頁的第一步也就是最關鍵一步必然是要寫分頁SQL語句,而且語句效率要高。當然本文的一個目的就是學習編寫分頁查詢語句,另一個目的則是幫助初學者更深入瞭解SELECT語句。

  那麼本文的一個查詢示例是查詢第11-15條記錄,即每頁5條,查第3頁包含的結果集。查詢的視圖名爲LeaveWordView,該視圖有個名爲ID的整型自增主鍵字段。

  好了,我現在要引出的第一種寫法呢是使用NOT IN關鍵字。

--IN 和 NOT IN,效率較低
--
查詢第11-15條記錄,後面的語句即可替換爲ADO.NET中執行Command的CommandText
SELECT TOP 5 * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP 10 ID FROM LeaveWordView)
--SELECT TOP PageSize * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP (PageIndex-1)*PageSize ID FROM LeaveWordView)

  這條語句的原理是先查詢1-10條記錄的ID,然後再查詢ID不屬於這1-10條記錄的ID,並且只需要5條記錄,因爲每頁大小就是5,這就是獲取到的第11-15條記錄,這是非常簡單的一種寫法。另外IN語句與NOT IN語句類似,這是NOT IN的寫法,但是顯然達不到我們的需求,因爲效率太低。所以我們接着看第二種寫法。

  第二種寫法也是相當易於理解,通過若干次升序與降序實現。

--通過升序與降序方式進行查詢分頁
SELECT * FROM(
SELECT TOP 5 * FROM(
SELECT TOP 15 * FROM LeaveWordView ORDER BY ID ASC)
AS TEMP1 ORDER BY ID DESC)
AS TEMP2 ORDER BY ID ASC

  這條語句首先查詢前15條記錄,然後在倒序查詢前5條記錄(即倒數5條記錄),這個時候就已經獲取到了11-15條記錄,但是他們的順序是倒序,所以最後又進行升序排序。

  接下來看第三種寫法,採用MAX(ID)函數。

--MIN()函數和MAX()函數的使用
--
id > 第(PageIndex-1)*PageSize條記錄的id AND id <= 第PageIndex*PageSize條記錄的id
SELECT TOP 5 * FROM LeaveWordView WHERE ID>
(SELECT MAX(ID) FROM(SELECT TOP 10 ID FROM LeaveWordView ORDER BY ID) AS TEMP1) --(第10條的id)

  這個理解起來也簡單,先把第十條記錄的id找出來(當然這裏面是直接使用MAX()進行查找,MIN()函數的用法也是類似的),然後再對比取比第十條記錄的id大的前5條記錄即爲我們需要的結果。

  OK,我們瞭解完了上述三種分頁查詢語句後,我來看最後一種,也是我本人推薦使用的一種,使用ROW_NUMBER。我記得Oracle有個ROWID,使得我們的查詢更方便,因爲我們很多時候就比較鬱悶於整型的ID字段不連續,導致了原本可以使用很簡單很高效的一些SQL語句查詢變成了較爲複雜。而到SQL Server2005出來的時候,類似的功能實現了,那便是ROW_NUMBER,ROW_NUMBER後面必須跟着OVER(ORDER BY [FIELD]),我們來看具體的寫法。

--用行號(ROW_NUMBER)查詢,比較高效的查詢方式,只有在SQL Server2005或更高版本才支持
--
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS ROWID FROM LeaveWordView
SELECT * FROM(
SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,*
FROM LeaveWordView) AS TEMP1
WHERE ROWID>10

  在這裏面需要注意的是OVER的括號裏面可以寫多個排序字段,比如:OVER(ORDER BY CreatedTime,ID)。這條語句是查詢前15條記錄,然後取出ROWID=10以後的記錄。

以上是4中常用分頁查詢語句,其實他們的效率在萬級別一下數據的時候,效率相差並不大,但是在處理上百萬數據時,毫無疑問我們將選擇最後一種方式。本文一個目的是探討分頁查詢,另一個呢則是分享SELECT語句的一些寫法。

  最後歡迎大家砸雞蛋……

  

 



 感謝閱讀,請留下您的意見或疑問! 能力有限,錯漏難免,歡迎指點!

 分割線:我的個人原創,請認準 http://freedong.cnblogs.com/ (轉摘不標原文出處可恥)

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