深蓝网络

网站建设,程序开发,主机域名,搜索引擎

高效率的Access分页的SQL语句


采用Access数据库有许多优点,比如数据库无须专门的数据库空间,使用,备份,迁移也非常方便。
但一旦数据量到达上万条,上十万条甚至更多的时候,ACCESS的大数据量的列表分页效率问题就出现了。
用普通的Recordset方法来分页会非常非常慢。
所以从SQL语句底层,找到高效率的分页方法才能优化效率,提高速度。

本文不再讨论用Adodb.Recordset,和SQL语句里的NOT IN或者MAX等方法。
因为这几种方法已经被证明无法承担起大数据量的分页任务。

给大家推荐的是双TOP法高效率的Access分页的SQL语句

先直接给SQL语句,然后再分析

SELECT * FROM 

(SELECT TOP "&pagesize&" * FROM 

(SELECT TOP "&page*pagesize&" 字段 FROM 表 ORDER BY id DESC) 

ORDER BY id) 

ORDER BY id DESC


注:pagesize 分页数  page当前第几页

这个方法就是选取当前页及小于当前分页的所有记录,然后通过"Top"方式选取当前页的记录。
虽然至少需要select两次,但当取靠前部的数据的时候效率是相当高的。
套在最外层的SELECT是为排序,连接其它表等等应用而加的。如是不需要可以去掉

比如Access数据ID为1-100,每页5条。当前页为第4页,排序是倒序的话。 


第一次,选择前4页的数据,即100-81共20条数据
第二次,从这20条数据中选择最小的5条,即81-85。
OK,完成


分析下这个针对ACCESS数据库的SQL的优缺点吧
优点
1,靠前的数据分页非常快,这符合网页客人的体验。一般都看最新的。
2,可以连接其它表(join加在最外层),加查询条件(where加在最里层的SELECT里)。
缺点
1,靠后的数据会变慢。
2,排序只能用不重复的主键(ID),否则会出现错误。
3,最后一页,如果少于pagesize,还是会显示整个页。

 

进一步的思路

针对缺点1,可以通过分析当前页位于数据表的哪个位置,上半区/下半区,然后再进行SQL查询。

针对缺点3,可以用ASP代码来过滤最后一页。如果是最后一页,那么pagesize取总记录数除以分页数的余数。

进阶代码就不给出了,大家可以自已思考下。


上一篇  |  下一篇
发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。