|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃。分页|数据|速率这篇文章要到达的目标就是,完成年夜数据分页扫瞄并最优化速率。
创建一个web使用,分页扫瞄功效必不成少;这个成绩也是久长以来最广泛的成绩,今朝也失掉了较好的办理,个中象ASP程序的分页算法有良多,好比利用ado工具的PageSize这些属性,按纪录总数盘算页,然后跳转纪录集再输入;也有编写存储历程完成分页数据,这些方面各有优弱点,以下自己先容一种使用实践项目中速率十分快的分页算法;
关头点:SQL(用TOP和主动编号完成)
页面剧本(扫瞄器回退功效)
情况:
IIS/SQLServer/Access
表布局:
createtable内容表(
主动编号IDENTITY(int,1,1)notnull,
分类编码<I>var</I>char(20)null,
题目<I>var</I>char(255)NULL,
内容<I>var</I>char(4000)null,
工夫datetimenull,
)
完成道理:
这个表设定了主动编号字段,这个字段的特征就是天生不反复的整形,包含删除纪录后该字段仍旧坚持‘流水性’(注:一般在体系表建立中,这类字段的使用很少,由于编号不克不及自在办理,但在这里利用它,次要是想在文章中省略编号保护的代码)。
分页:
那末第一步,就是查询一个页的数据;假如有100条记录,按20纪录一页,那末一般的分页算法就是“页总数=总纪录除分页的把持数[不足数的话,页总数加一]”,如许的做法就招致必需发生一切纪录的一个年夜纪录集;从而,又有人提出了用存储历程的分页算法,前者是asp剧本发生年夜纪录集,如许速率相称慢,后者是杀鸡用牛刀,固然我常常写存储历程,但依据我的思绪会发明写存储历程完整过剩。
在SQL中,很多刚打仗它的伴侣都晓得Top润色关头字的感化;比方:selectTOP1*fromtable1--如许就完成从Table1表前往只要一笔记录的纪录集那末分页优化的终极目标就是制止发生过年夜的纪录集,经由过程TOP便可完整把持;如今查询表应当是selectTop20主动编号,题目,内容,工夫from内容表。
但如今另有个成绩,就是怎样定位,Top不成能主动给我们定位输入某个页,这就计划到了where从句,依据一个特定前提输入准确的内容;注重:纪录的orderby排序长短常主要的,这个决意了这个算法的成败;
这里的演示是DESC体例,倒序分列,好比网站的软件更新,就是比来的更新放最后面,而这个就是倒序体例。
OK,上面来看看实践代码,起首要断定是不是为肇端页。
dimstrSQL,i,endID,isBeginPage
constCnt_PageSize=20界说每页纪录的巨细
经由过程反省扫瞄器传送的Page参数的值来判别是不是为进进下一页的操纵
isBeginPage=isEmpty(request("Page"))orrequest("Page")=""orrequest("Page")"next"
这里是分页的中心
ifisBeginPagethen假如是肇端页
查询=列出分类编码即是参数flbm的纪录,按倒序分列,并只列出前Cnt_PageSize笔(Cnt_PageSize是常量界说,好比20)
strSQL="selectTOP"&Cnt_pageSize&"主动编号,题目,内容,工夫from内容表where分类编码="&TRIM(SQLEncode(request("flbm")))&"orderby主动编号desc"
else假如不是肇端页
ifrequest("Page")="next"then这里如许写是为了增强代码的体现,假如参数为next,则暗示取下页内容
查询=列出分类编码即是参数flbm的纪录而且要小于主动编号endID(endID也是参数),并倒序分列,并只列出前Cnt_PageSize笔(Cnt_PageSize是常量界说,好比20)
strSQL="selectTOP"&Cnt_pageSize&"主动编号,题目,内容,工夫from内容表where分类编码="&TRIM(SQLEncode(request("flbm")))&"and主动编号<"&request("endID")&"orderby主动编号desc"
Endif
endif
翻开数据毗连实行SQL并创建纪录集
setrs=Cnn.Execute(strSQL)
ifnotrs.Eofthen这里写进判别是不是为Eof能够不要,可是,在这里却有它的特别意义
callTableTitle这里是自写的函数,用于创建表格标志
callbeginTr这里是创建表格tr标志
fori=0tors.fields.Count-1遍历纪录集字段
callAddCol(rs(i).name)输入字段名
Next
callendTr
whilenotrs.eof轮回纪录集内容,并输入
callbeginTr
fori=0tors.fields.Count-1
callAddRow(ASPEncode(rs(i).value))
Next
callendTr
endID=rs("主动编号")这里保留每次输入的主动编号值
rs.MoveNext
Wend
callTableBottom到此为止,就复杂的将纪录集内容全体输入
这里输入翻页标志,vbaIIF是自写函数
原型为<I>function</I>vbaIIF(a,b,c)
ifathen
vbaIIF=b
else
vbaIIF=c
endif
end<I>function</I>
上一页的完成是经由过程剧本挪用扫瞄器的功效history.back(1)完成,那末回页时其实不必要在服务器端从头天生数据,速率不必思索了。
在首页的时分,上一页的链策应该是有效的,经由过程vbaIIF(isBeginPage,"disabled","")完成,假如为首页,那末在标志中到场disabled属性,假如不是首页,则到场history.back(1);剧本指令,用于回退扫瞄页。
下一页是传送Page参数和endID参数,Page设置为next暗示为下一页的举措,endID暗示以后纪录集的开端编号,下页将由此分页。
response.Write("〈ahref=""#""onclick=""java<I>script</I>:"&vbaIIF(isBeginPage,"","history.back(1);")&""""&vbaIIF(isBeginPage,"disabled","")&"〉上一页〈/a〉|〈ahref=""TypeOptions.asp?flbm="&request("flbm")&"&Page=next&endID="&endID&"""〉下一页〈/a〉")
else
这里经由过程判别纪录集是不是为空来办理到开端页还能够持续翻页的成绩
ifnotisBeginPagethen
判别是不是为空纪录,而且不是肇端页,那末天生回退页面的剧本,效果就是进进该页后将主动前往到上页。
response.Write"〈<I>script</I>language=java<I>script</I>〉"&vbCrlf
Response.W</p>asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了! |
|