加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

提升网页性能的高级页面分页技术来自 ASP

发布时间:2023-07-10 14:32:57 所属栏目:Asp教程 来源:
导读:一种高效的SELECT TOP分页算法。代码如下:

<%

&#39;每页的记录数

dim pagesize

pagesize= "30"

&#39;读出总记录数,总页数,飘易注

Dim TotalRecords,TotalPages

SQLstr="Select count(id
一种高效的SELECT TOP分页算法。代码如下:

<%
 
'每页的记录数
 
dim pagesize
 
pagesize= "30"
 
'读出总记录数,总页数,飘易注
 
Dim TotalRecords,TotalPages
 
SQLstr="Select count(id) As RecordSum From table1"
 
Set Rs=conn.Execute(SQLstr,0,1)
 
TotalRecords=Rs("RecordSum")
 
if Int(TotalRecords/pagesize)=TotalRecords/pagesize then
 
TotalPages=TotalRecords/pagesize
 
else
 
TotalPages=Int(TotalRecords/pagesize)+1
 
end if
 
Rs.Close
 
Set Rs=Nothing
 
'当前页码,飘易注
 
dim page
 
page=Request("page")
 
if isnumeric(page)=false then
 
response.write "<SCRIPT language=JavaScript>alert('参数错误!');"
 
response.write "window.close();</SCRIPT>"
 
response.end
 
end if
 
If page="" or page<1 Then page=1
 
If page-TotalPages>0 Then page=TotalPages
 
page=int(page)
 
if page=1 then
 
sql="select top "&pagesize&" id,title,time from table1 order by time desc"
 
else
 
sql="select top "&pagesize&" id,title,time from table1 where time<(SELECT Min(time) FROM (SELECT TOP "&pagesize*(page-1)&" time FROM table1 ORDER BY time desc) AS T) order by time desc"
 
end if
 
Set rs = Server.CreateObject ("ADODB.Recordset")
 
rs.Open sql,conn,1,1
 
Do While Not rs.Eof
 
response.write "每条记录信息:"&rs("id")&"<br>"
 
rs.movenext
 
loop
 
rs.close
 
set rs=nothing
 
''翻页代码省略……
 
%>
 
    这是一种非常高效的分页算法。当数据表中的数据量成百上千万的时候,上面的这种分页算法的响应时间是非常短的,通常在几十毫秒之内。原理很简单,就是每次分页,我只取需要的几十条记录而已,使用SELECT TOP也正是基于这样的考虑。
 
    上面的两个分页算法的例子中,flymorn都使用了时间字段time来进行order by排序,因为在我接触的绝大多数系统中,我们都需要把用户最近更新(包括新添加的记录以及新修改过的老记录)的内容展示在前面,如果仅仅使用自动编号的ID作为排序字段的话,用户编辑过的老信息将无法展示在前面。这就是flymorn使用时间字段的原因了。
 
    这里又涉及到聚合索引的问题了。默认情况下,我们是以自动编号ID作为主键,并且用作聚合索引列,如果上面的算法中,使用这样的ID列来排序的话,效率会更高,数据库响应的时间会更少;然而,我提到了最近更新的内容需要展示在前面的问题,所以,我们必须使用时间字段来排序。因此,为了更高的分页效率,我们可以在数据库设计的时候,把这个时间字段设计为聚合索引列。
 
    通过这样的设计后,整个分页效率就会得到非常高的提高了。
 
    然而,把这个时间字段作为聚合索引列,存在又一个小问题。因为数据表在排列数据的时候,是按照聚合索引列来进行物理排序的,当用户添加数据的时候,没有什么问题,在数据表的末尾添加就行了;当用户编辑信息的时候,数据库需要根据这个聚合索引列,把刚编辑过的信息也提到表的末尾,这里就需要耗费一定的时间了。就是说,当我们以时间字段为聚合索引列的时候,我们就需要在 UPDATE 数据的时候多耗费一点的时间。
 
    然而,综合比较而言,飘易认为,SELECT TOP的高效分页算法的关键是要避免全表扫描,尽量只获取需要的字段,排序的字段最好是聚合索引列,实践表明,以聚合索引列来排序的SQL语句的响应时间是最快的。这样处理之后,对于SQL SERVER数据库来说,即使上千万的数据量,也不用怕分页算法失去响应了。
 
    上面是以 ASP 语言为例写的算法,当然同样可以改造成其他的如ASP.NET,PHP语言所使用。为了更好的使用这样的分页代码,大家也可以把上面的算法改写成存储过程。
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章