40W的SQL数据,ASP中如何快速分页?

241219 2008-04-03 11:00:00
40W的SQL数据,如何快速分页?
...全文
210 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lifefamily 2008-04-06
其实没有必要存储过程,如果仅仅40万的话。优化的SQL语句即可。
看看我们的网站
http://www.bioon.com.cn 基本每一个表数据都达到40万左右,速度很快,当然这还不是最优化的。
还有http://www.biodic.cn 120万,模糊查询,速度也很快。

程序的效率是几方面,一是SQL效率的问题,优化语句!二是ADO的效率,不要传输大数据,如查询40000页,只传输第40000页的内容,而不是传输整个4万页的,实现方法有存储过程,当然也可以用SQL语句直接实现,不必存储过程。三是代码效率,ASP差了些,但还行。
回复
sy_binbin 2008-04-04
要想很好的解决大数据量的分页

临时表,存储过程,索引最好组合起来使用。特别是索引,一个组合索引能达到意想不到的结果。


另外还可以考虑下数据库的表分区。
回复
bwangel 2008-04-04
关于分页,确实有必要深入讨论,我看了很多存储过程式的,基本就是那种
select top XX * from table where id not in(select top xx id from table)的那种。包括13楼所说的那种。

请大家注意这个not in,它是数据库最大的敌人。当你点击“最后一页”时,就知道not in的厉害了。

而我的方法没有用not in或者in或者exists这类严重影响效率的东东,可以充分利用索引优化,原理也很简单,经过测试,不足之处是一次性内存占用比较多。不过再怎么占用,也比传统的分页要少。
回复
cisky 2008-04-04
同意楼上,另外,数据太大,建议建游标吧
回复
苍白之月 2008-04-04
7楼 的办法 基本算不上有效率的分页

现在关于分页也没有一个统一的意见 也就是都说自己的好

基本都是根据个人经验做

做法上面的总结的差不多了
1、存储过程
2、临时表

40万记录 其实你只要加索引 用7楼的办法就可以了

个人比较推崇的是做临时表(当然要考虑记录数更新频率)

举个例子
40万记录 每页20条 就是2万页
有人会一页一页的点吗?
那么大家经常的点无外乎是前10页 也就是说你剩下的19990页就是分出来了也是无用功

再有要说的就是 把功夫下在数据离线 比考虑如何分页效果好的多
回复
windykuang 2008-04-03
UP
回复
ab520ah 2008-04-03
顶楼主你一下。
http://qzshi.com
网站建设技术论坛
另外招版主,或合作管理员,有兴趣的加群4228406
回复
bwangel 2008-04-03
用存储过程是一法,但不便于移植。以下是我写的不用存储过程的代码:


''''通用分页函数,返回页号为Page的记录集''''''
'TableName-表名
'KeyId-排序关键字名
'FieldList-要查询的字段列表
'Cond-条件
'DESC-是否降序
'Page-当前页号
'PSize-页大小
'RCount-记录总数
'Ps -查询要用到的参数数组
FUNCTION RsPage(TableName, KeyID, FieldList, Cond, Desc, Page, PSize, RCount,Ps)
Dim boundID,Descs,MaxMinKeyID, GtLt,pcnt
if Desc then
Descs="ORDER BY " + KeyID +" DESC"
MaxMinKeyID = "MIN("+KeyID+")"
GtLt = "<"
else
Descs="ORDER BY " + KeyID
MaxMinKeyID = "MAX("+KeyID+")"
GtLt = ">"
end if

Sql = "SELECT COUNT("+KeyID+") FROM "+TableName+" WHERE "+ Cond
RCount = ExecInt(sql,Ps)
pcnt = (RCount-1) \ PSize + 1
if Page<1 then Page=1
if Page>Pcnt then page=Pcnt
sql = "SELECT "+MaxMinKeyID+" FROM (SELECT TOP "& (Page-1)*PSize & " " & KeyID &" FROM "+TableName+" WHERE ("+Cond+ ")"+DESCs + ") " & Left(KeyID,1)
boundID=ExecStr(sql,Ps)
if boundID = "" then GtLt="<>"
sql = "SELECT Top "&PSize & " " & FieldList & " FROM " & TableName &" WHERE (" & KeyID & GtLt &"'"& boundID & "') and (" & Cond & ")" & Descs
set RsPage=ExecRs(sql,Ps)
End Function
回复
Atai-Lu 2008-04-03

CREATE PROCEDURE [dbo].[pGetMesList]
@pagesize int,
@pageindex int
AS
DECLARE @strSQL varchar(5000)

--准备分页
declare @maxpage int --总页数
declare @datacount int --总数据条数
--set @maxpage=0
set @datacount=(select count(ID) from [pmessage])
if(@datacount%@pagesize)=0
begin
set @maxpage=(@datacount/@pagesize)
end
else
begin
set @maxpage=(@datacount/@pagesize)+1
end
--开始分页
IF @pageindex = 1
begin
SET @strSQL = 'select top '+str(@pagesize)+' '+str(@datacount)+' as datacount,'+str(@maxpage)+' as maxpage, * from [pmessage]
order by [ID] desc'
end

else
begin
SET @strSQL = 'select top '+str(@pagesize)+' '+str(@datacount)+' as datacount,'+str(@maxpage)+' as maxpage, * from [pmessage]
where ([ID] not in (select top '+str((@pageindex-1)*@pagesize)+' [ID] from [pmessage] order by [ID] desc))
order by [ID] desc'
end
EXEC(@strSQL)
GO

回复
241219 2008-04-03
有无哪位发个例子来呢?
回复
SQL的一般都使用存储过程分页
回复
siyee 2008-04-03
存储过程
网上去搜一个
以前有,忘掉放哪里了
不好意思
回复
xiaojing7 2008-04-03
分页可以客户端页可以存储过程来分
40W的可以用存储过程来实现
或者用临时表来实现,
回复
Atai-Lu 2008-04-03
用存储过程分页
回复
gingerkang 2008-04-03
建好索引,只取本页数据,只取需要字段,缓存总数
知道的只有这些了.
回复
wcplym 2008-04-03
你算找对人了:
一个非常好且经过优化测试的分页存储过程(1)
http://www.wcplym.com/techArticleDetail.asp?id=27&
一个非常好且经过优化测试的分页存储过程(2)
http://www.wcplym.com/techArticleDetail.asp?id=39
回复
mafengcf 2008-04-03
bwangel测试速度可以
回复
暴走的车轮 2008-04-03
四裤全输的代码是不错~~~~
回复
bwangel 2008-04-03
为了"推销"自己的代码,我来发个测试页:
http://keke100.vicp.net/
内有100万条记录。各位可以测试一下速度。当然因为我是用ADSL+自己的机子+花生壳作测试,请大家考虑一下网速。
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2008-04-03 11:00
社区公告
暂无公告