常用的數據分頁技術及比較


1.數據分頁概述
  • 通常在Web頁面中,在數據量比較大時,無法在一個頁面中顯示所有數據 
  • 在某些特定場景下,並不需要返回所有滿足條件的數據
  • 從數據的角度看,需要返回指定范圍內的數據

2.數據層分頁技術
  • 在數據庫查詢時,只查詢特定頁面的數據
  • 主要由T -SQL來完成 
  • 適用於比較大的數據表
  • 優點:返回的結果集小,查詢速度快
  • 缺點:需要多次查詢數據庫

3.數據層分頁技術-使用臨時表

  • 在查詢數據前,創建一個臨時表
  • 表的列比要返回的結果集多一個標識列
  • 按照特定列排序,將結果插入到臨時表中
  • 此時,可以按照標識列返回特定頁面
4.數據層分頁技術-使用表變量
  • 在查詢數據前,創建一個表變量
  • 表的列比要返回的結果集多一個標識列
  • 按照特定列排序,將結果插入到表變量中
  • 此時,可以按照標識列返回特定頁面
5.數據層分頁技術-反復取Top  
  • 若要按特定列正排序取第91-100 行數據
  • 首先,按特定列正排序取Top 100 
  • 然后,反向排序取Top 10
  • 最后,再將結果正排序后返回
6.數據層分頁技術-使用行號
  • 在SQL Server 2005/2008中
  • 查詢結果集時,添加一個ROW NUMBER() 表示行號
  • 將上述結果集作為子查詢,通過ROW_NUMBER() 篩選出特定頁面

7.代碼如下:

View Code
USE AdventureWorks2008
GO
SELECT COUNT(*) FROM Production.TransactionHistoryArchive
GO
SELECT TOP 50 * FROM Production.TransactionHistoryArchive
ORDER BY ReferenceOrderID ASC
GO

--Use Top*Top
DECLARE @Start datetime,@end datetime;
SET @Start=getdate();

DECLARE @PageNumber INT, @Count INT, @Sql varchar(max);
SET @PageNumber=5000;
SET @Count=10;
SET @Sql='SELECT T2.* FROM (
    SELECT TOP 10 T1.* FROM 
        (SELECT TOP ' + STR(@PageNumber*@Count) +' * FROM Production.TransactionHistoryArchive
        ORDER BY ReferenceOrderID ASC) AS T1
    ORDER BY ReferenceOrderID DESC) AS T2
ORDER BY ReferenceOrderID ASC';
EXEC (@sql);

SET @end=getdate();
PRINT Datediff(millisecond,@Start,@end);
GO

--USE table value
DECLARE @Start datetime,@end datetime;
SET @Start=getdate();
DECLARE @PageNumber INT, @Count INT, @Sql varchar(max);
SET @PageNumber=5000;
SET @Count=10;

DECLARE @local_variable table (RowNumber int identity(1,1),[TransactionID] [int],
    [ProductID] [int],
    [ReferenceOrderID] [int],
    [ReferenceOrderLineID] [int],
    [TransactionDate] [datetime],
    [TransactionType] [nchar](1),
    [Quantity] [int],
    [ActualCost] [money],
    [ModifiedDate] [datetime]);
insert into @local_variable (TransactionID, ProductID, ReferenceOrderID, ReferenceOrderLineID, TransactionDate, TransactionType, Quantity, ActualCost, ModifiedDate) 
SELECT TOP 50000 TransactionID, ProductID, ReferenceOrderID, ReferenceOrderLineID, TransactionDate, TransactionType, Quantity, ActualCost, ModifiedDate from Production.TransactionHistoryArchive ORDER BY ReferenceOrderID ASC
select * from @local_variable where RowNumber > (@PageNumber-1)*@Count and RowNumber <= @PageNumber*@Count

SET @end=getdate();
PRINT Datediff(millisecond,@Start,@end);
GO

--USE temp table
DECLARE @Start datetime,@end datetime;
SET @Start=getdate();
DECLARE @PageNumber INT, @Count INT, @Sql varchar(max);
SET @PageNumber=5000;
SET @Count=10;

create table #local_variable(RowNumber int identity(1,1),[TransactionID] [int],
    [ProductID] [int],
    [ReferenceOrderID] [int],
    [ReferenceOrderLineID] [int],
    [TransactionDate] [datetime],
    [TransactionType] [nchar](1),
    [Quantity] [int],
    [ActualCost] [money],
    [ModifiedDate] [datetime]);
insert into #local_variable (TransactionID, ProductID, ReferenceOrderID, ReferenceOrderLineID, TransactionDate, TransactionType, Quantity, ActualCost, ModifiedDate) 
SELECT TOP 50000 TransactionID, ProductID, ReferenceOrderID, ReferenceOrderLineID, TransactionDate, TransactionType, Quantity, ActualCost, ModifiedDate from Production.TransactionHistoryArchive ORDER BY ReferenceOrderID ASC
select * from #local_variable where RowNumber > (@PageNumber-1)*@Count and RowNumber <= @PageNumber*@Count

SET @end=getdate();
PRINT Datediff(millisecond,@Start,@end);
GO

--Use ROW_NUMBER
DECLARE @Start datetime,@end datetime;
SET @Start=getdate();

DECLARE @PageNumber INT, @Count INT, @Sql varchar(max);
SET @PageNumber=5000;
SET @Count=10;
SELECT * FROM 
(    SELECT ROW_NUMBER()  
      OVER(ORDER BY ReferenceOrderID) AS RowNumber,    
      *
    FROM Production.TransactionHistoryArchive) AS T
WHERE T.RowNumber<=@PageNumber*@Count AND T.RowNumber>(@PageNumber-1)*@Count;

SET @end=getdate();
PRINT Datediff(millisecond,@Start,@end);
GO

8.應用層分頁技術
  • 在應用層/邏輯層緩存數據,並進行數據的分段顯示
  • 主要由程序代碼完成
  • 優點:查詢數據庫次數少,每次返回結果快
  • 缺點:第一次查詢慢,占用應用層內存資源
9.應用層分頁技術-GridView
  • 應用GridView的分頁功能
  • 啟用XxxDataSource 控件的緩存功能 
10.應用層分頁技術-DataPager
  • .NET 3.5 當中的新控件
  • 更加靈活定義分頁格式
11.應用層分頁技術-LINQ
  • 自定義數據綁定
  • 使用LINQ 進行查詢
  • 使用Skip() 和Take() 函數

12.展現層分頁技術
  • 在客戶端進行數據分頁
  • 主要通過客戶端腳本來實現
  • 優點:減少網絡傳輸量,提高帶寬利用率
  • 缺點:需要編寫大量客戶端腳本,增加開發與維護成本
13.展現層分頁技術-UpdatePanel
  • 通過ASP.NET AJAX 中的UpdatePanel 控件,可以將應用層所提供的分頁功能轉換到客戶端
  • 無需維護代碼
  • 充分利用服務器端控件功能
14.展現層分頁技術-Data Services
  • 使用Data Services所提供的基於URI 的數據訪問,可以實現數據分頁
  • 在展現層,可以直接通過Javascript 進行解析
  • 輕量級數據傳輸格式:XML/JSON

轉載請注明出處:http://www.cnblogs.com/refactor


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM