大数据量下的分页

大数据量下的分页


作者:郭红俊      出处:Mscommunity
        对于非常大的数据模型而言,分页检索时,每次都加载整个数据源非常浪费。通常的选择是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。 
        本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页,为了便于实现演示,数据表采用了Northwind数据库的Orders表(830条记录)。 
        如果数据表中有唯一的自增索引,并且这个字段没有出现断号现象。检索页面大小的块区数据就非常简单了。通过简单的Sql语句就可以实现这个功能:
select * from orders where orderid between 10248 and 10253
其中,开始编号为:(CurrentPageIndex - 1) * PageSize 结束编号为:CurrentPageIndex * PageSize 
当然,如果这个字段断号不是很严重,而且允许不是很严格的按照每页条数分页,这样的方法也是可以用的。 

      如果这个字段断号,或者需要按照其他条件排序分页,就要复杂些了。首先要获得这个页面需要显示的编号,然后再按照这个编号获得需要的块区数据。根据编号获得块区数据很简单。不过用下面方式获得数据排序并不是按照指定的id列表顺序,这时候还要附加order by 命令。
select * from orders where orderid in (10248,10249,10250,10251,10252,10253) order by orderid desc
获得这个页面需要显示的编号列表就复杂多了,而且有多种方案: 
方案一:维护一个表,这个表记录需要显示的这些编号排序顺序。(这个表可以是临时表,也可以是物理表)。下面演示了利用一个全局临时表。这个全局临时表记录需要显示的编号。注意排序,这里的order by 就是需要显示的排序顺序。
Code
注意:实际使用这个方案的时候,还要考虑何时更新这个全局临时表,一般是放到计划任务中,定时更新这个汇总表。 
方案二:每次都去查询,每次获得最新的编号顺序。由于这时候不存在这个临时表,书写获得需要显示页面的编号的字符串就需要点技巧,看下面的代码:
Code
asp.net 的 DataGrid 提供了使用这种分区的数据的方法。 DataGrid 通过 AllowCustomPaging 和 VirtualItemCount 属性支持块区操作。如果 AllowCustomPaging 为 true,则 DataGrid 不会根据 CurrentPageIndex 计算数据模型中的起始显示位置。DataGrid 将显示数据模型中的所有数据,而页导航栏将当前位置报告为 (VirtualItemCount PageSize-1)/PageSize 之 CurrentPageIndex 页。下面的示例说明此功能。
Code
如果你有更多数据量的表稍加修改,也可以使用本演示程序。其下是演示代码下载,演示代码使用的是方案二。使用方法看readme.txt文件。 
整个演示代码 下载

http://chs.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/datagrid/doc_datagrid.aspx#paging

这里演示了利用DataGrid 的这个功能(没有本文中讨论的利用存储过程获得分区数据)。如对DataGrid的这个功能不太熟悉,请先看这里。 
我最近碰到大数据量分页的问题,经过跟csdn网友讨论,觉得比较可行的方案就是上面提到的2种方案,有谁有更好的方案,或者发现问题请email联系我,thanks 
我的email是:
[url=mailto:ghj1976@csdn.net]ghj1976@csdn.net[/url]

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Asp.Net] 的这些文章也感兴趣:

解读System.Web.UI.Page中关键方法ProcessRequestMain()  C#调用oracle存储过程 最简单的实例
ASP.net中Panel控件用法  自定义应用程序配置文件(app.config)
ASP.NET中实现直接从网页上下载文件,而不须引用文件URL来下载  ASP.NET中数据库数据导入Excel并打印(1)
ASP.NET中实时图表的实现  .NET框架中基于角色的安全性(1)
XmlReader 读取器读取内存流 MemoryStream 的注意事项  栈实现字符串表达式计算
ASP.NET MVC Preview 5 演示Demo #8 实现JQuery结合Json进行后台数据Ajax方式验证 给初学.net的新手您几点建议
直接用Response输出可以加批注的Excel  .Net开发中一些好的文章
asp.net实现DropDownList、ListBox无刷新三级联动的两种方法  关机/休眠/重启/注销的类
C#中使用反射显示程序集的所有类型和属性  asp.net多频道网站架构实现方法
Creating HTTP Handler Factory for serving RSS and ATOM feeds 利用ASP.NET 2.0客户端callbacks限制postbacks