使用數據庫分頁返回用戶數據有以下好處:
一、減小服務器磁盤系統地讀取壓力
二、減小網絡流量,減輕網絡壓力
三、減輕客戶端顯示數據的壓力
四、提升處理效率。sql
通常而言分頁處理分爲兩種:應用程序中的分頁(查詢出全部數據)處理和數據庫中的分頁處理。目前大多數的應用都是在應用程序中藉助支持數據分頁處理的數據庫訪問組件(如DataGrid控件)實現分頁處理(大部分的分頁插件中也是採用的程序分頁)。實際上,在數據庫中實現分頁處理,能夠從源頭減小數據處理量,效果每每可能更好。數據庫
因此咱們在須要分頁的時候儘可能使用數據庫分頁效果是更好的。緩存
常規的取第n頁數據方法爲服務器
SELECT TOP PageSize * FROM TableA WHERE Primary_Key NOT IN (SELECT TOP (n-1) * PageSize Primary_Key FROM TableA )
這樣的若是改爲存儲過程大概是這樣的網絡
CREATE PROC up_PageView ( @tableName SYSNAME , @colKey NVARCHAR(100) , @pageCurrent INT = 1 , @pageSize INT = 10 , @colShow NVARCHAR(4000) = '' , @colOrder NVARCHAR(200) = '' , @where NVARCHAR(2000) = '' , @pageCount INT OUTPUT ) AS BEGIN IF OBJECT_ID(@tableName) IS NULL BEGIN RAISERROR('the table is not existing!', 16,1) RETURN END IF ISNULL(@colShow,'') = '' SET @colShow = '*' IF ISNULL(@colOrder,'') = '' SET @colOrder = '' ELSE SET @colOrder = 'order by ' + @colOrder IF ISNULL(@where,'') = '' SET @where = '' ELSE SET @where = 'where ' + @where DECLARE @sql NVARCHAR(4000) IF @pageCount IS NULL BEGIN SET @sql = 'select @pageCount = count(*) from ' + @tableName + ' ' + @where EXEC sp_executesql @sql , '@pageCount int output' , @pageCount OUTPUT SET @pageCount = ( @pageCount + @pageSize - 1 ) / @pageSize -- get total pages END IF @pageCurrent = 1 BEGIN SET @sql = N'select top' + N' ' + CONVERT(NVARCHAR(10),@pageSize) + N' ' + @colshow + N' ' + N'from ' + @tableName + N' ' + @where + N' ' + @colOrder EXEC (@sql) END ELSE BEGIN DECLARE @topN INT , @topN1 INT -- set @topN = @pageSize -- set @topN1 = @pageCurrent * @pageSize SET @pageCurrent = @pageCurrent * @pageSize SET @sql = N'select @n = @n - 1, @s = case when @n < ' + CONVERT(NVARCHAR(10),@pageSize) + N' then @s + '','' + quotename(@colKey, N'''''''') ' + N'else ''''' + N' end ' + N' from ' + @tableName + N' ' + @where --make query effect only @pageCurrent records --Query only top @pageCurrent * @pageSize SET ROWCOUNT @pageCurrent EXEC sp_executesql @sql , '@n int, @s nvarchar(max) output' , @pageCurrent , @sql OUTPUT SET ROWCOUNT 0 --recover to default config SET @sql = STUFF(@sql,1,1,N'') -- remove the first ',' --exec the query EXEC (N'select ' + @colShow + N' ' + 'from' + N' ' + @tableName + N' ' + N'where ' + @colKey + N' in (' + @sql + ')' + @colOrder) END END go
可是這種執行起來效率比較低,這樣是把 top n 取大量的數據並緩存起來,在關聯元表查詢出最終結果。函數
下面咱們採用另外一種方法,在 sql server 2005 之後增長了一些新的功能如取得排名或順序的函數(Rank(), Dense_Rank(), Row_Number()), 利用這些新的功能也能進行分頁處理,下面以sql server 2005 自帶的數據庫AdventureWorks爲例結合Row_Number() 實現分頁處理:spa
CREATE PROC up_GetPagen ( @pageSize INT , @pageCurrent INT , @countPage INT OUTPUT ) AS BEGIN SELECT * FROM ( SELECT ROW_NUMBER () OVER (ORDER BY id) RowNum,* FROM TableA ) TA WHERE RowNum BETWEEN ( @pageCurrent - 1 ) * @pageSize + 1 AND @pageCurrent * @pageSize ORDER BY Id --另加一個返回總記錄數吧。 SELECT @countPage = COUNT(0) FROM TableA END