海量数据分页问题

pzlk 2007-07-13 04:53:12
相信很多人关心这个问题,希望把各位的意见和经验集中一下,也好给其他朋友做个参考.
===========================

用asp.net2.0中的gridview控件 绑定数据源
可以很方便的实现数据的显示,分页

如果要手写代码进行数据绑定,并且数据量很大(几百万条)的情况下,如何分页显示数据呢?
希望高手们能给出主流数据库(如orcale,sqlserver2000,sqlserver2005)的示例,有多种方法(如用存储过程,非存储过程,自定义控件)更好.谢谢

...全文
683 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
huiaccp 2007-07-17
  • 打赏
  • 举报
回复
SQL Server 2000和 SQL Server 2005實現分頁的方式
2000:
首先获得所有的记录集合的存储过程:
create PROCEDURE [dbo].[P_GetOrderNumber]
AS
select count(orderid) from orders;----orders为表
RETURN
分页的存储过程
create procedure [dbo].[P_GetPagedOrders2000]
(@startIndex int, ---开始页数
@pageSize int----每一页显示的数目
)
as
set nocount on
declare @indextable table(id int identity(1,1),nid int) ----定义一个表变量
declare @PageUpperBound int
set @PageUpperBound=@startIndex+@pagesize-1
set rowcount @PageUpperBound
insert into @indextable(nid) select orderid from orders order by orderid desc
select O.orderid,O.orderdate,O.customerid,C.CompanyName,E.FirstName+' '+E.LastName as EmployeeName
from orders O
left outer join Customers C
on O.CustomerID=C.CustomerID
left outer join Employees E
on O.EmployeeID=E.EmployeeID
inner join @indextable t on
O.orderid=t.nid
where t.id between @startIndex and @PageUpperBound order by t.id ----实现分页的关键
set nocount off

2005:
create [dbo].[P_GetPagedOrders2005]
(@startIndex INT,
@pageSize INT
)
AS
begin
WITH orderList AS (
SELECT ROW_NUMBER() OVER (ORDER BY O.orderid DESC)AS Row, O.orderid,O.orderdate,O.customerid,C.CompanyName,E.FirstName+' '+E.LastName as EmployeeName
from orders O
left outer join Customers C
on O.CustomerID=C.CustomerID
left outer join Employees E
on O.EmployeeID=E.EmployeeID)
SELECT orderid,orderdate,customerid,companyName,employeeName
FROM orderlist
WHERE Row between @startIndex and @startIndex+@pageSize-1
end
tepc2000 2007-07-17
  • 打赏
  • 举报
回复
up
MicroSoftor 2007-07-17
  • 打赏
  • 举报
回复
aspnetpager
confei 2007-07-17
  • 打赏
  • 举报
回复
分页强烈建议采用临时表
Ilovesport 2007-07-17
  • 打赏
  • 举报
回复
mark
pzlk 2007-07-17
  • 打赏
  • 举报
回复
下面是从asp改过来的代码
对于几百万数据量的表,前面翻页还快的,越往后越慢,到后面平均要2-3秒
//' ============================================
//' 分页sql语句生成代码
//' TblName: 表名
//' FldName: 索引字段名: 一般为ID
//' FieldList: 需要显示的字段列表
//' PageSize: 每页条数
//' PageIndex: 当前页码
//' OrderType: 排序方式 0: asc 1: desc
//' StrWhere: where 语句
//' ============================================

private string GetPageSql(string tblName,string fldName,string fldList,long lPageSize,long lPageIndex,int orderType,string strWhere)
{
string strTemp="";
string strSql="";
string strOrder="";
string strTmp="";

if (orderType == 0)
{
strTemp = "> (Select Max([" + fldName + "])";
strOrder = " order by [" + fldName + "]";
}
else
{
strTemp = "< (Select Min([" + fldName + "])";
strOrder= " order by ["+fldName+"] desc";
}
if (lPageIndex==0) {lPageIndex=1;}
if (lPageIndex == 1)
{
strTemp = "";
if (strWhere != "")
{
strTmp = " where " + strWhere;
}
strSql = "select top " + lPageSize + " " + fldList + " from [" + tblName + "]" + strTmp + strOrder;
}
else
{
strSql="select top " + lPageSize +" "+ fldList + " from ["+tblName+"] where ["+fldName+"]" + strTemp + " from(select top " + (lPageIndex -1)*lPageSize + " ["+fldName+"] from ["+tblName+"]";
if (strWhere!="")
{
strSql=strSql + " where " + strWhere;
}
strSql = strSql + strOrder + ") as TblTemp)";
if (strWhere!="")
{
strSql = strSql + " and " + strWhere;
}
strSql = strSql + strOrder;
}
return strSql;
}
}


不用存储过程有没有更好的方法?
crossrowman 2007-07-17
  • 打赏
  • 举报
回复
mark.
namhyuk 2007-07-17
  • 打赏
  • 举报
回复
mark.
ezhuyin 2007-07-17
  • 打赏
  • 举报
回复
要看客户的需求如何。
需求1:最经常看的数据是前10页;
需求2:最经常看的数据是后10页;
需求3:经常需要下载全部检索到的数据……

这里要说的意思是:根据不同客户的需求来优化查询的存储过程。并没一个通用的。
ezhuyin 2007-07-17
  • 打赏
  • 举报
回复
提一点思想,代码网络上有不少。

要看客户的需求如何。
需求1:最经常看的数据是前10页;
需求2:最经常看的数据是后10页;
需求3:经常需要下载全部检索到的数据……

需求1、2可以使用ViewState+Stored Procedure来办到,需求3,下载数据该多久就是多久,最好在服务器生成文件以后提一个下载链接,这样快一些,不然总是要担心延时问题,特别是数据量大,而网络速度不很快的。用Stored Procedure的话,如果要求在View里面每列都可以Sort,就会有些困难。
happy_test 2007-07-17
  • 打赏
  • 举报
回复
up
yjddit 2007-07-16
  • 打赏
  • 举报
回复
加我QQ:110343042,给你过程分页,这些人不厚道,只会说
sqllong 2007-07-16
  • 打赏
  • 举报
回复
mark
BearRui 2007-07-16
  • 打赏
  • 举报
回复
用存储过程分页吧,这个比较快,而且建议使用SQL没有对外公布的 sp_cursoropen、sp_cursorfetch、sp_cursorclose进行分页。

速度很快,
缺点:会先返回1个空的数据库集!!!
pzlk 2007-07-16
  • 打赏
  • 举报
回复
前几天下载了一个pet shop 4.0,听说很不错

刚才把里面的数据加到了50万条,速度就不行了,点下一页的时候大约要10秒的时间才能读取出4条数据,总觉得不应该这么慢吧

楼上说了这么多存储过程啥的,有谁肯练一练,把这个改进一下呢?

增加50万条数据

declare @a decimal
set @a=0

while @a<500000

begin

insert into product (
productId,
CategoryId,
Name,
Descn,
Image
)
values (
'bd-'+convert(char(10),@a),
'BIRDS',
'bd-'+convert(char(10),@a),
'x',
'~/Prod_Images/Birds/icon-pelican.gif'
)
set @a=@a+1
continue

end
zhuawang 2007-07-15
  • 打赏
  • 举报
回复
AspNetPager+存储过程
存储过程最好用一个通用的分页存储过程,可以网上搜搜
cowge 2007-07-15
  • 打赏
  • 举报
回复
知道分页的原理就行了,每次只读取你所需的记录数,用存储过程更好
CSharpEx 2007-07-15
  • 打赏
  • 举报
回复
使用SQL语句进行分页,或者使用存储过程完成,别把所有的数据都查一遍
Jinglecat 2007-07-15
  • 打赏
  • 举报
回复
mark
aSalt 2007-07-15
  • 打赏
  • 举报
回复
jf
加载更多回复(12)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧