zoukankan      html  css  js  c++  java
  • 常用的数据分页技术及比较

    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

  • 相关阅读:
    第03组 Alpha冲刺(3/6)
    第03组 Alpha冲刺(2/6)
    第03组 Alpha冲刺(1/6)
    团队项目-选题报告
    第3组 团队展示
    福大软工 · BETA 版冲刺前准备(团队)
    Alpha 事后诸葛亮
    Alpha冲刺
    Alpha冲刺-(9/10)
    Alpha冲刺
  • 原文地址:https://www.cnblogs.com/refactor/p/2552700.html
Copyright © 2011-2022 走看看