控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

常用的数据分页技术及比较

作者:未知 出处:cnblogs 2012年07月02日 阅读:

 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.代码如下:
 
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

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统