SQL Server 2005: 利用新的ranking函數(shù)實(shí)現(xiàn)高效的數(shù)據(jù)分頁(yè)操作
最近MSDN Magazine上的一篇文章10 Tips for Writing High-Performance Web Applications提到了有效的數(shù)據(jù)分頁(yè)技術(shù)對(duì)提高ASP .NET程序性能的重要性;并給出了一個(gè)實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的stored procedure的例子,抄錄如下:
CREATE PROCEDURE northwind_OrdersPaged
( @PageIndex int, @PageSize int)
ASBEGINDECLARE @PageLowerBound intDECLARE @PageUpperBound intDECLARE @RowsToReturn int-- First set the rowcountSET @RowsToReturn = @PageSize * (@PageIndex + 1)SET ROWCOUNT @RowsToReturn-- Set the page boundsSET @PageLowerBound = @PageSize * @PageIndexSET @PageUpperBound = @PageLowerBound + @PageSize + 1-- Create a temp table to store the select resultsCREATE TABLE #PageIndex ( IndexId int IDENTITY (1, 1) NOT NULL, OrderID int)-- Insert into the temp tableINSERT INTO #PageIndex (OrderID)SELECT OrderIDFROM OrdersORDER BY OrderID DESC-- Return total countSELECT COUNT(OrderID) FROM Orders-- Return paged resultsSELECT O.*FROM Orders O, #PageIndex PageIndexWHERE O.OrderID = PageIndex.OrderID AND PageIndex.IndexID > @PageLowerBound AND PageIndex.IndexID < @PageUpperBoundORDER BY PageIndex.IndexIDEND
在SQL Server 2000里面,由于沒(méi)有一個(gè)有效的進(jìn)行ranking操作的方法,所以該例子先創(chuàng)建了一個(gè)有Identity字段的臨時(shí)表,利用Identity字段的自增長(zhǎng)特性,間接的為Orders表的每一行按orderID逆序賦予了一個(gè)行號(hào), 然后基于這個(gè)行號(hào)實(shí)現(xiàn)分頁(yè)。
在SQL Server 2000里面,由于系統(tǒng)提供了內(nèi)建的ranking函數(shù),為了給Orders表生成行號(hào),我們不再需要利用Identity字段。
例如,利用SQL Server 2000的ROW_NUMBER()函數(shù),按orderID字段逆序排列,給Orders表生成行號(hào)的語(yǔ)句如下:SELECT ROW_NUMBER() OVER(ORDER BY ordered DESC) AS rownum, ordered
FROM Orders
ORDER BY rownum DESC
基于這些新的ranking函數(shù),您可以跟方便的實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)操作。
關(guān)于SQL Server 2005的T-SQL新特性,見(jiàn)文檔:
http://msdn.microsoft.com/sql/archive/default.aspx?pull=/library/en-us/dnsql90/html/sql_05tsqlenhance.asp
