一种效率极高的ASP分页思想

用他的思路试验了,,42000多条记录,,执行时间0.000秒

在ASP中显示大量数据时的翻页问题已经有不少文章介绍过了,一般情况下利用ADO页定位方法实现翻页功能。但随着数据库内容增多,翻页的效率问题就突出了,ADO的页定位方法速度明显地有些令人不能容忍。
  为了找到一种高效率的翻页方法,我分析了常见的几种ADO页定位方法,发现在翻页前都要利用查询语句把符合条件的纪录读出,放入RecordSet集合,然后再进行翻页的计算和操作。如果符合条件的纪录数大于你设定的每页显示纪录数,则多出来的纪录虽然已经读出但却没有用上,在翻到下一页时,又重新查询数据库。也就是说,如果你找到符合要求的500条纪录,查询时读出了500条纪录,但每页只显示20条纪录,这就有480条纪录读出后没用,翻页时又重复上述操作。众所周知,从数据源读取数据的操作是很费时间的,更何况读出来的数据大部份用不上呢?于是,我想如果每次只读出符合条件的、数量不超过每页显示条数的纪录应该是效率最高的,顺着这个思路又考虑到翻页所必需的条件,就产生了记住每页两端的记录号、翻页时只从端点读取每页显示条数的分页方法。
  由于接触ASP的时间不长,从思路到实现还有一段距离,故在一个论坛中提出了这个想法与大家讨论,经过该论坛版主和网友们的分析、建议和指教逐步完成了这段代码,在我的老PII机器上进行检测,效果比较明显。在此特详细思路、解决办法、代码贴出请各位高人指教。

一、原则
1.每次刷新页面时根据翻页的方向,只读取自id1或id2开始的rows条纪录。
2.显示查询结果时用for/next循环,不用where not rs.eof and i<=rows/loop循环,目的是在循环时不检验rs.eof以提高速度。
3.当纪录的序号不连续时也能正常完成翻页功能。

二、方法
1.数据表中建立一个自动编号字段ID用以识别纪录号。
2.第一次查询时读出所有符合条件的纪录,用以计算有多少页(max)和多少条纪录(num),以后查询时每次只读出rows条纪录,并且不做重复计算。
3.用sql语句的TOP rows格式来读出所需要的数据,翻页的主要工作在这里完成。
4.向前翻页时用降序排序的方法实现。
5.用url转移时带上每页的页号、两端的端点号、最大页数、最大纪录数。

  开始写代码的时候用过复合查询、升序排序等种种办法,结果均不理想,翻页经常翻到岔路上去,主要问题是如果用where ID<id1 则数据是从ID=0开始的rows条纪录,直接显示了第一页,没有达到向前翻页的目的;如果用降序排序,则数据是从ID<=id1开始的,但向后翻页的端点id2<id1,造成了混乱。当时直埋怨作系统的为何不来个Bottom N或Last N之类的指令,那就简单多了。试了几次后突然想到一个笨办法:既然是降序排序,在显示的时候反过来循环不就一切正常了?看来最简单的办法也可能是最有效的办法。另外,我认为除了用记忆端点分页的可以提高效率外,程序是否精炼,也会影响到速度。

这段代码没有考虑页面跳转的功能,我想除了论坛以外,如果是资料查询检索,页面跳转的用处不大,尤其是向后跳转。至于向前跳转,在代码中加入一些指令实现起来不难。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页