|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了!foxty[原作]
克日一向在研讨怎样才干写出高小的分页算法,也许收拾了一下,思绪以下:
起首数据库里必要有一个主动编号字段(ID)。然后第一次会见的时分,掏出一切纪录,定制好每页的纪录数PageSize,盘算出页数,然后依据页数创建一个一维数组PageId(PageCount),PageId(0)保留纪录初试前提,然后对应每一个元素保留每页对应的ID界限码
(
1,ID界限码:假如数据库纪录ID纪录序列以下1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
假定必要依照ID按次排序的话,PageSize=5,Pagecount=4,PageId(4)
数组PageId的值分离为PageId(0)=1,PageId(1)=5,PageId(2)=10,PageId(3)=15,PageId(4)=16
当会见第i页的时分就间接找[PageId(i-1),PageId(i))之间的纪录,如许能够包管每次取的纪录都只是PageSize笔记录。
假定必要依照ID倒序分列的话,
数组PageId的值分离为PageId(0)=16,PageId(1)=12,PageId(2)=7,PageId(3)=2,PageId(4)=1,当会见第i页的时分就间接查找ID属于[PageId(i-1),PageId(i))
)
将数组PageId()保留在Application()中,以便会见,如许,只是第一次会见分页程序的时分便初始化Application()。代码部分以下:(上面称为新程序)
<%
Time1=Timer()
DimConn
SetConn=Server.CreateObject("Adodb.Connection")
Conn.open"Driver={MicroSoftAccessDriver(*.mdb)};Dbq="&Server.MapPath("db.mdb")
www.ckuyun.com
DimPage,PageCounts,PageId,PageList
DimRs,Sql
DimIsInit,i
IsInit=False标记为,用来判别Application("PageId")是不是初始化
PageList=20设置每页显现20条数据
SetRs=Server.CreateObject("Adodb.Recordset")
Page=Request.QueryString("Page")注重页码必要反省范例
IfIsEmpty(Application("PageId"))Then假如Application("PageId")还未初始化,则先辈行初始化
Response.Write("Initapp!<br>")
Sql="Select*FromtestOrderByIdDesc"假定这里是依照ID倒序分列
Rs.openSql,Conn,1,1失掉纪录集工具
IfNot(Rs.EoforRs.Bof)Then
Rs.PageSize=PageList设置每页纪录数
PageCounts=Rs.PageCount
ReDimPageId(PageCounts)从头界说数组PageId
Fori=0ToPageCounts入手下手给数组PageId()赋值
IfRs.eofThenExitFor
PageId(i)=Rs("ID")
Rs.Move(PageList)
Next
Rs.MoveLast
PageId(PageCounts)=Rs("ID")
Application.Lock()
Application("PageId")=PageId
Application.UnLock()
EndIf
Rs.Close
EndIf
IdStart=Clng(Application("PageId")(Page-1))
IdEnd=Clng(Application("PageId")(Page))
Sql="Select*fromtestwhereid<="&IdStart&"andid>"&IdEnd&""
Rs.openSql,Conn,1,1
WhileNotRs.eof
Response.Write(rs(0)&"--"&rs(1))
Rs.MoveNext
Wend
Rs.Close
SetRs=Nothing
Conn.Close
SetConn=Nothing
Fori=1ToUbound(Application("PageId"))
Response.Write("<ahref=Test1.asp?Page="&i&">"&i&"</a> ")
Next
Time2=Timer()
Response.Write("<br>"&(Time2-Time1)*1000)
Application.Contents.Remove("PageId")
%>
传统分页代码以下:(上面称为旧程序)
<%
Time1=Timer()
DimConn
SetConn=Server.CreateObject("Adodb.Connection")
Conn.open"Driver={MicroSoftAccessDriver(*.mdb)};Dbq="&Server.MapPath("db.mdb")
DimPage,PageCounts,PageList
DimRs,Sql
PageList=20
Page=Request.QueryString("Page")
SetRs=Server.CreateObject("Adodb.Recordset")
Sql="Select*fromtestorderbyiddesc"
Rs.OpenSql,Conn,1,1
IfPage=""ThenPage=1
IfNot(Rs.eofOrRs.Bof)Then
Rs.PageSize=PageList
PageCounts=Rs.PageCount
Rs.AbsolutePage=Page
EndIf
Fori=1toPageList
IfRs.eofThenExitFor
Response.Write(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.MoveNext
next
Fori=1ToPageCounts
Response.Write("<ahref=Test.asp?Page="&i&">"&i&"</a> ")
Next
Time2=Timer()
Response.Write("<br>"&(Time2-Time1)*1000)
%>
实在,整体的头脑就是,创建一个Application("PageId")全局数组,每一个元素都保留页面所区纪录的ID区间,好比,Application("PageId")(0)保留第一个元素的ID,然后Application("PageId")(1)保留下一页的第一个ID…………顺次类推,当必要会见第i页的时分,就间接查找ID在[Application("PageId")(i-1),Application("i"))内里的纪录集,如许,每次只用查找必要的纪录数,而不必要每次都把一切纪录都查找一遍,可是,这个办法是在第一次会见的时分,即必要创立数组Application("PageId")的时分对照慢一点,当第N次会见的时分(N>1)速率就快快要10倍,我接纳下面2个程序测试:
1,数据库纪录有32000笔记录,旧程序会见一页必要500毫秒摆布,新程序只是第一次会见的时分到达这个工夫,然后每次都只必要55毫秒摆布。
2,将数据增添到64000笔记录,旧程序会见一页必要1000毫秒摆布,新程序也是第一次会见的时分到达这个仿佛件,前面每次仍旧仍是坚持在55毫秒摆布。
3,将数据增添到128000笔记录,旧程序会见一页必要1900毫秒摆布,新程序第一次会见必要2300毫秒摆布,然后每次会见只必要70毫秒摆布。
这里必要注重的是数据库每修改一次,Application("PageId")就必要从头赋值!
研讨心得:(起首感谢叶子(DVBBS)的心得)只管不要用自带的分页程序,Rs.RecordCount很耗资本。顺次,估量Rs.PageCount……也耗资本,并且用Rs.GetRows()效果也很分明进步。
经由对照,叶子的算法在纪录对照靠前的时分速率和效力是对照高的。可是不太不乱,偶然(很少)会从30毫秒摆布跳到1-200毫秒。到了前面效力就分明下落到50-80毫秒,越后效力越低。新算法第一次效力对照低下,约莫在500毫秒摆布,可是对照不乱,前面一样平常哦度是50毫秒摆布,并且跟着库的纪录数变更,这个速率仍然云云。不会有甚么变更。下次就把叶子和我的算法分离起来尝尝,不外叶子的算法的确是很不错D,具有通用性。我这个只能拿来聊聊了。
国内有些大的CRM厂商的ASP就写得不错.无论是概念还是它里面用JAVASCRIPT的能力.并不是说现在的程序员用了ASP.NET来写程序就可以说自己高档了 |
|