大数据量下的分页 (转载)

?
专栏作品
大数据量下的分页
?
对于非常大的数据模型而言,分页检索时,每次都加载整个数据源非常浪费。通常的选择是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。
??? 本文演示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 就是需要显示的排序顺序。
?
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 -- 实际执行时候,删除全部临时表当然不再这里执行。
?
这个临时表存在,获得指定分页的分块数据就很简单了。看下面代码:
?
    
    
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值