一般习惯使用的有两种分页算法,一是传统的ADO分页,二是SELECT TOP分页算法。对于小型数据表,比如一两万的数据量的表,我倾向使用ADO算法,对于大型的数据表,则必须采用后者的算法了。

先来说说传统的ADO分页算法。

这种算法,使用起来简单容易,很容易上手,对于小心数据库来说是首选,其执行效率很高,数据库自带的游标功能进行翻页的时候也很方便。

其通常使用的代码如下:
<%
dim recordcountnum,page,i,j
listnum = "30" '每页显示记录数
sql="select id,title,time from table1 order by time desc"
Set rs = Server.CreateObject ("ADODB.Recordset")
rs.Open sql,conn,1,1
If rs.eof and rs.bof Then
Else
recordcountnum=Rs.recordcount
Rs.pagesize = listnum
page = Request("page")
If page = "" or page < 1 Then
page=1
End If
If (page-Rs.pagecount) > 0 Then
page=Rs.pagecount
End If
Rs.absolutepage=page
j=rs.recordcount
j=j-(page-1)*listnum
i=0
Do While Not rs.Eof and i<listnum
response.write "每条记录信息:"&rs("id")&"<br>"
i=i+1
rs.movenext
loop
''翻页代码略……
%> 这种ADO游标的分页算法,由于每次加载页面都要重新读取数据表的全部数据,虽然游标的使用非常简单,当数据表容量不大的情况下,也是可以使用的;但当数据量非常大的情况下,使用这种分页方法的效率无疑是极低的。 所以,我们需要引入另外一种高效的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语言所使用。为了更好的使用这样的分页代码,大家也可以把上面的算法改写成存储过程。

  

ASP的高效率的分页算法.net,php同样可以参考的更多相关文章

  1. 【转】SQL Server海量数据库的索引、查询优化及分页算法

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  2. ASP利用Recordset实现分页

    <!--#INCLUDE FILE="../function/db.asp" --> <!--#INCLUDE FILE="../function/co ...

  3. 基于视觉的Web页面分页算法VIPS的实现源代码下载

    基于视觉的Web页面分页算法VIPS的实现源代码下载 - tingya的专栏 - 博客频道 - CSDN.NET 基于视觉的Web页面分页算法VIPS的实现源代码下载 分类: 技术杂烩 2006-04 ...

  4. VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]

    VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] 分类 ...

  5. 学习ASP.NET MVC(十一)——分页

    在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList. ...

  6. Java中常见的分页算法

    在查询数据的时候或者展示数据的时候经常会使用分页,介绍几种简单的分页算法: //总的页数 int total = 30: //每页个数 int pageSize = 6; 1.one     int ...

  7. Html列表分页算法

    public class PageHelper { /// <summary> /// 标签 /// </summary> public string Tag { get; s ...

  8. asp.net利用存储过程分页代码

    -最通用的分页存储过程 -- 获取指定页的数据 CREATE PROCEDURE Pagination ), -- 表名 ) = '*', -- 需要返回的列 )='', -- 排序的字段名 , -- ...

  9. 一个方便的java分页算法

    一个好用的java分页算法,代码如下,只需要分页参数继承Pageable类就可以很方便分页了 package cn.com.base.common.pagination; /** * 分页基类 * * ...

随机推荐

  1. 【创建本地仓库】【for Centos】CentOS下创建本地repository

    [日期]2014年4月24日 [平台]Centos 6.5 [工具]httpd yum-utils createrepo [步骤] 1)安装httpd. yum install httpd 2)安装y ...

  2. bigData Ecosystem Unscramble

    主题>>: cloudEra hadoop Ecosystem sim Unscramble; ruiy哥个人理解总结,其实我无非也还是站在那"砖家/叫兽"的肩上瞎扯扯 ...

  3. SQL Server Profiler参数说明

    上图依次说明为: TextDate 依赖于跟踪中捕获的事件类的文本值: ApplicationName 创建 SQL Server 连接的客户端应用程序的名称.此列由该应用程序传递的值填充,而不是由所 ...

  4. flex开发小技巧集锦

    关于flex开发网上有非常多的相关信息介绍,因此我们要想学习关于flex开发的知识信息技能是一件非常简单和方便的事情.而针对于flex开发小编要告诉大家的是一些flex开发小技巧.利用这些小技巧能够有 ...

  5. .@RequestMapping 使用方法

    1.@RequestMapping  使用方法  SpringMVC中,@RequestMapping用来处理请求,比方XXX.do @RequestMapping("/aaa") ...

  6. 新浪旗下的SAE云服务入门

    前言: 云服务已经火热很多年了,到了现在已经基本进入稳定期,稍微有实力的公司都会推出免费的云存储,像百度的还几个T,速度也不错.如果不担心数据安全问题,代替平时的U盘还是没有问题.而SAE是新浪在20 ...

  7. IOS debug网络PonyDebugger 实践篇

    引言:  PonyDebugger是一个很给力的iOS调试工具,它的监视器安装在Chrome浏览器下做为插件使用,通过监视器和PonyDebugger的iOS SDK相辅相成,可以很好的监视App的运 ...

  8. Introdution to 3D Game Programming With DirectX11 第11章 习题解答

    11.1 这道题要注意使用了line strip,由于曾经一直用triangle list,所以在几何渲染的时候easy算错定点描绘的顺序. 贴一些代码,大概就能把这个问题解释清楚了,由于框架还不是特 ...

  9. mysqldump原理3

    现网中数据库运维时,要经常对数据库做热备.为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务. mysqldump是当前MySQL中最常用的备份工具,通过mysq ...

  10. 性能测试中用LambdaProbe监控Tomcat Tomcat和Probe的配置

    转载:http://bbs.51testing.com/thread-90047-1-1.html 性能测试中用LambdaProbe监控TomcatLambdaProbe 是一款强大的免费开源工具, ...