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
    复制代码
    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

     
    分类: C#SqlServer
  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2567413.html
Copyright © 2011-2022 走看看