在做动态网页的过程中,经常会用到对查询结果进行分页显示,使用不同的动态的语言就有不同的方法。通常由两种办法,我把它概括如下:
    一.在查询结果集中处理分页。
    二.通过查询条件取出规定数目的记录数来实现分页。
    以前我一直都是在使用第一种方法,比方说我在使用PHP读取MS SQL SERVER的时候就是先把符合条件的所有记录一次性取出放在结果集中,然后通过mssql_data_seek(结果集,当前记录的偏移量)把游标定位到本页要显示的记录集所在位置,然后再根据每页显示个数,做一个控制循环,依次取出记录显示。但ASP没有seek这种方法,所以ASP一般是通过ADO Recordset对象提供的几个专门支持分页处理的属性:PageSize(页大小)、PageCount(页数目)以及AbsolutePage(绝对页)来管理分页处理。但是这种办法当是一次性的将所有记录都读入内存然后再根据指示来依次分析从而达到分页显示的效果,而不像第二种方法是先根据指示作出判断并将规定数目的符合条件的条件的记录读入内存,从而直接达到分页显示的功能。当数据库中的记录比较少时,我们不会感觉到以上两种方法处理结果会有什么不同,但是当数据库中的记录数达到上万或者更多的时,第一种方法的执行效率明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后进行分页等处理,如果同时有超过100个客户在先查询,那么应用程序的执行效率将大受影响。
    所以这次我尝试使用了第二种方法,通过使用SQL嵌套查询结合TOP关键字,举例如下:
    SELECT TOP 10 字段1,字段2  FROM 数据库 WHERE (字段3  NOT IN  (SELECT TOP 20 字段3  FROM   数据库  WHERE 字段4= 'XXX'  ORDER BY 字段5))    AND   字段4= 'XXX'  ORDER BY   字段5
    通过TOP后面的数字就可以取出一定分为内的记录了,以上例子就从数据库中取出了第21条至30条的10条记录,感觉执行效率还可以,编写代码也挺简单,第一个Top后的数字就是每页要显示记录数,第二个Top后的数字就是此页之前的页面总数。

posted on 2006-03-24 11:29  cheerwen  阅读(2539)  评论(3编辑  收藏  举报