ASP.net大数据量下的分页

  对于非常大的数据模型而言,分页检索时,每次都加载整个数据源非常浪费。通常的选择是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。

  本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页,为了便于实现演示,数据表采用了Northwind数据库的Orders表(830条记录)。

  如果数据表中有唯一的自增索引,并且这个字段没有出现断号现象。检索页面大小的块区数据就非常简单了。通过简单的Sql语句就可以实现这个功能:www.nkbiv.com

  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 就是需要显示的排序顺序。

  create table ##temptable(

  iid int IDENTITY (1, 1) NOT NULL,

  mainid int NOT NULL

  )

  insert ##temptable(mainid) select orderID from orders order by orderID desc

  select * from ##temptable

  drop table ##temptable -- 实际执行时候,删除全部临时表当然不再这里执行。

  这个临时表存在,获得指定分页的分块数据就很简单了。看下面代码:www.oiurn.com

  create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)

  insert ##temptable(mainid) select orderID from orders order by orderID desc

  declare @PageSize int,@CurrPage int,@strSQL varchar(2000),@IDStr varchar(1000)

  select @PageSize = 30

  select @CurrPage = 2

  select @IDStr = ''

  select @IDStr = @IDStr + ltrim(rtrim(str(MainID))) + ',' from ##temptable

  where iid between ((@CurrPage-1)*@PageSize+1) and @CurrPage*@PageSize

  if @IDStr <> ''

  begin

  select @IDStr = left(@IDStr,len(@IDStr)-1)

  end

  select @strSQL = 'select * from orders where orderID in ('+@IDStr+') order by orderID desc '

  exec(@strSQL)

  drop table ##temptable

  注意:实际使用这个方案的时候,还要考虑何时更新这个全局临时表,一般是放到计划任务中,定时更新这个汇总表。

  方案二:每次都去查询,每次获得最新的编号顺序。由于这时候不存在这个临时表,书写获得需要显示页面的编号的字符串就需要点技巧,看下面的代码: declare @PageSize int,@CurrPage int,

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值