您的位置:首页 > 其它

[转]几种常用分页算法运行效率大比拼

2010-08-30 17:08 274 查看
算法一:
sql语句:select * from [ABCD] order by stu_id
分页原理:把所有的记录都查出来,再用记录集的一些方法得到总页数和指定当前页次。每次翻页都要重复查询一次相同的数据。
ASP中用rs.pagesize设定每页的记录数,用rs.pagecount得到总页数,用rs.absolutepage指定当前的页次。
JSP中用rs.getRow()得到记录条数,用rs.absolute(posion)指定当前记录的位置。
算法评价:这个是效率最低的分页方式,但是一般的书上用的最多的分页方式,很多人最开始做asp或者jsp都是用这种方式分页。但不管什么情况下都不推荐用这种分页方式。
我做这个测试的时候每翻一次页都要用4500ms左右。这个数据是在asp环境中测得的,jsp下没有测,估计应该差不多。

算法二:
sql语句:select top {pagesize} * from [ABCD] where stu_id not in(select top {(currentpage-1)*pagesize} stu_id from [ABCD] order by stu_id) order by stu_id分页原理:先用select count(*) from [ABCD]查出记录条数,再据此算出总页数totalpage=(totalcount+pagesize-1)/pagesize;查询数据时先从数据库中查出本页前面所有的数据,再从数据库中剩下的数据中查出前pagesize条。比如现在正在显示的是第5页,怎么查出第6页的数据呢?先把前5页的25条数据查出来,再从数据库中剩下的99975条记录中查出前5条。
算法评价:在我测试的三种算法中,这个是效率最高的算法。前几十页中每翻一页要30-40ms,随着页数增加时间也在增加,最高的时候在400-500ms之间。

算法三:
sql语句:select * from (select top {pagesize} * from (select top {currentpage*pagesize} * from [ABCD] order by stu_id) as A order by stu_id Desc) as B order by stu_id分页原理:首先按照升序得到前currengpage*pagesize行的结果集A,然后按照降序从A中得到后pagesize行的结果集B,最后按照升序对B进行重新排序,返回结果集。比如:现在页面上显示的是第5页数据,得到第6页数据的方法是:先从数据库中查出前30条记录,再查出这30条记录的后5条,把这5条记录按正序重新排序后返回结果。
算法评价:这个是效率比较高的算法。前面几十页的执行效率与算法二不相上下,但随着页数据增加时间也在增加,最高的时候在500-600ms之间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: