数字分页(转)

http://www.cnblogs.com/msos/archive/2009/07/15/1524196.html 

http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html 

• 数据分页概述
• 数据层分页技术
• 应用层分页技术
• 展现层分页技术

数据分页概述
• 通常在Web页面中,在数据量比较大时,无法在一个页面中显示所有数据
• 在某些特定场景下,并不需要返回所有满足条件的数据
• 从数据的角度看,需要返回指定范围内的数据

数据层分页技术
• 在数据库查询时,只查询特定页面的数据
• 主要由T-SQL 来完成
• 适用于比较大的数据表
• 优点:返回的结果集小,查询速度快
• 缺点:需要多次查询数据库

1、数据层分页技术-使用临时表
• 在查询数据前,创建一个临时表
• 表的列比要返回的结果集多一个标识列
• 按照特定列排序,将结果插入到临时表中
• 此时,可以按照标识列返回特定页面

2、数据层分页技术-使用表变量
• 在查询数据前,创建一个表变量
• 表的列比要返回的结果集多一个标识列
• 按照特定列排序,将结果插入到表变量中
• 此时,可以按照标识列返回特定页面

3、数据层分页技术-反复取Top
• 若要按特定列正排序取第91-100 行数据
• 首先,按特定列正排序取Top 100
• 然后,反向排序取Top 10
• 最后,再将结果正排序后返回

4、数据层分页技术-使用行号
• 在SQL Server 2005/2008 中
• 查询结果集时,添加一个ROW_NUMBER()表示行号
• 将上述结果集作为子查询,通过ROW_NUMBER() 筛选出特定页面

    比较几种数据层分页技术

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

-- USE temp table(耗时 1156 ms) 
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 table variable(耗时 1676 ms)
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 Top*Top(耗时 546 ms)
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 ROW_NUMBER(耗时 283 ms)
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
应用层分页技术

• 在应用层/逻辑层缓存数据,并进行数据的分段显示
• 主要由程序代码完成
• 优点:查询数据库次数少,每次返回结果快
• 缺点:第一次查询慢,占用应用层内存资源

1、应用层分页技术-GridView
• 应用GridView 的分页功能
• 启用XxxDataSource 控件的缓存功能

2、应用层分页技术-DataPager
• .NET 3.5 当中的新控件
• 更加灵活定义分页格式

3、应用层分页技术-LINQ
• 自定义数据绑定
• 使用LINQ 进行查询
• 使用Skip() 和Take() 函数

 

展现层分页技术
• 在客户端进行数据分页
• 主要通过客户端脚本来实现
• 优点:减少网络传输量,提高带宽利用率
• 缺点:需要编写大量客户端脚本,增加开发与维护成本

1、展现层分页技术-UpdatePanel
• 通过ASP.NET AJAX 中的UpdatePanel 控件,可以将应用层所提供的分页功能转换到客户端
• 无需维护代码
• 充分利用服务器端控件功能

2、展现层分页技术-ado.net 3.5 Data Services
• 使用Data Services 所提供的基于URI 的数据访问,可以实现数据分页
• 在展现层,可以直接通过Javascript 进行解析
• 轻量级数据传输格式:XML/JSON

转载于:https://www.cnblogs.com/chixiaojin/archive/2011/09/20/2182779.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值