首页 > 编程 > ASP > 正文

ASP的高效率的分页算法

2024-05-04 11:06:40
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 一种高效的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语言所使用。为了更好的使用这样的分页代码,大家也可以把上面的算法改写成存储过程。

        最后,留一个小问题:select top分页的时候,当翻页到最后的时候,如果排序字段列不是聚合索引列的时候,程序的响应时间会如何呢?

    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表