转载access的分页查询效率问题

ACCESS数据库大数据量分页的几种方法比较及测试结果分析 ACCESS数据库大数据量分页的几种方法比较及测试结果分析 ACCESS数据库大数据量分页的几种方法比较及测试结果分析 立即下载

ACCESS数据库大数据量分页的几种方法比较及测试结果分析

本文解决的问题:
1.ACCESS是否存在更有效率的分页方法?
2.现有ACCESS大数据量10万条数据分页的效率测试
3.ACCESS的数据承载量到底有多大?

    相信很多ASP的站点还在使用access数据库,因为access数据库无须开专门的数据库空间,调用,迁移也方便,节省费用。另外对网站搭建者的专业能力要求也相对低一些。但随着网站的运行,数据库体积越来越大,数据量也从最初的几百条到了现在的上万条,上十万条甚至更多。于是因数据应用级别的改变带来的各种各样的应用问题出现了。而其中大数据量的列表分页效率问题更是让很多人头疼。笔者随便通过“大数据量分页效率”,“access 分页”等关键词分别百度和谷歌了一下,发现有此疑问的大有人在。很多网页上也给出了不同的解决办法。那么,这些方法到底能达到优化效率,提高速度的目的吗?
    先让我们来看看以下的几个access分页优化方案,当然如果你直接将数据库升级到sql server,那么有更好的诸如存储过程等方法。今天我们就讨论一下access大数据量优化分页方法,以及access到底能承受多少数据量。
方案一:利用ado本身的结果集的pagesize,AbsolutePage的属性来进行分页
程序示例:(仅供示意,完善的各种条件判断自行添加)
MaxPerPage=20
page=cint(request("page"))

sql="select * from 表 where 条件 order by 排序条件"
set rst=server.CreateObject("adodb.recordset")
rst.open sql,conn,1,1
rst.pagesize=MaxPerPage
rst.AbsolutePage = Page   '将记录定位到对应页数的第一条
for i=1 to MaxPerPage
    循环列表
    rst.movenext
    if rst.eof then exit for
next

这个方法是最为常用的access分页方法。
缺点:每次都要读入符合条件的所有记录,然后再定位于对应页的记录。当数据量大的时候,效率就十分的低下。
与此相似的方法是利用ado的move方法,每次将记录集游标移动 (page-1)*pagesize ,就实现了了记录的分页。经过测试,效率与方案一大致相同。

方案二:
1.设置一个自增长字段.并且该字段为INDEX.
2.由于是 ACCESS ,所以,只能是前台分页.自增长字段目的,就是为了实现分页功能.
    1> 记录用户前页的最后一个 自增值 ,例如 M .
  2> 下一页,取下一页的开始值.M+1 ,结束值: M+1+1.5*PAGESIZE (注:由于数据库会有增删操作,故应该取页大小应该有一个系数,你可以根据情况自定一个1大的系数.
  3> 前台循环取 RS 的前 PAGESIZE 条, 写到一个 新的RS中,并返回.

这个方案通过自增值来分部截取不同分页的数据列表,文中考虑到数据库有增删操作,所以加入了一个系数的概念,这是一个不得已的做法。这个方案可以保证分页效率,但只能运用于增删不太频繁(自增值字段相邻记录的值相差不多的情况)的数据表。

方案三:not in 方法。这个方案在很多网站上都转载。据说对于越往前的分页效率提高越明显。我一直有所怀疑,因为“not in”本身就是个耗费资源的算法。很难相信一个低效率的方法能提高大数据量分页的效率。示例如下:
sql="select top 12 * from 表 where Id not in(select top page*pagesize Id from 表 order by id desc) order by Id desc"
如果是第9页,每页20条即
select top 20 * from 表 where Id not in(select top 9*20 Id from 表 order by id desc) order by Id desc

原理即:选择top 20 的记录,条件是id不在前面分页的记录ID里。通过这种方式过滤掉前面分页的记录,然后通过top高效率的方式获取当页的记录。
“top”确实高效,但是“not in”呢?
于是我直接用这种方法测试了一下,测试条件:10万条数据。点击查询.......... MY GOD,长时间无响应,最后Ctrl+Alt+Delete 结束任务。再试,结果同样如此。于是改变一下测试条件,变成1000条数据,OK,结果显示非常顺利。
结论:如果你是大数据量分页,还是不要用这种方法,会死人的。

方案四:"select * from (select top "&pagesize&" * from (select top "&page*pagesize&" * from 表" order by id desc) order by id) order by id desc"
这个方法简单说来,就是选取当前页及小于当前分页的所有记录,再通过“Top”方式选取当前页的记录。
这个方法没有出现效率低的语句,虽然至少要select两次(示例select了三次是为了排序)。但是效率应该不错。且越靠前的分页应该越明显。
如果还想节省效率,可以只select两次。
假如记录ID为1-100,每页5条。现在显示第4页,排序为倒序。
执行顺序:
1) 选择前4页的数据,即100-81共20条数据
2) 从这20条数据中选择最小的5条,即81-85。
3) 将选择的5条按倒序排,即成为 85-81。

如果节省第三步也可,只不过显示变成
第一页:96,97,98,99,100
第二页:91,92,93,94,95
.
.
.
其实也不错。

光说没用,最终看测试结果。我在相同的数据条件,服务器配置下,分别对方案一中的两种方法和方案四进行了access分页效率测试,测试数据如下
测试条件:>10万条;pagesize=20;分页总数>5000页;顺便也进行了一下“select 部分字段”和“select 所有字段”的对比测试。

从上面的测试结果来看,方案三的优势还是比较明显的。而到5000页的效率基本上和前两种方法差不多,甚至仍然有一定得优势。

另外,很多人在写select语句时, 习惯 select * from 表,这不是一个好习惯。上面的access分页测试结果表明,还是按需索要,按需供应的好,需要什么字段,就select什么字段。能够极大的节省服务器资源。

很多网友提到ACCESS时都不免的轻视,“你还在用access?”,“还不换sql server?”,“用access你还想多快?”。其实在我的经验看来,即便是在10万条的应用级别上。access常常比sql server快。因为sql server需要额外连接,且多了一个带宽连接因素的影响(当然,网站服务器和数据库服务器运行速度和带宽都很OK,那没话说)。
sql server 在更高数据级别上的速度优势还是比较明显,毕竟与access不是一个级别的产品。

为了探索一下access数据库的极限。在40万条数据的情况下进行了上述分页测试。速度确实大打折扣。但是第三种方案在一万页内还是表现不错的。此时数据库已经达到400多兆。再结合之前处理过的几个4,500兆的access数据库。我认为40万条数据是access数据库在一般应用的一个界限,但不是极限。超过这个数,就需要在程序优化上做太多的工作。就有些不太值了。

希望本信息为你解决了问题和疑惑,或者有表述不清,请留言告知我们!欢迎大家多多指教!

windows无法配置此无线连接-笔记本使用故障系列
java读取*.mdb文件数据 jdbc连接Access数据库分页读取数据, 包含示例代码,Access驱动包ucanaccess-2.0.9.2.jar 立即下载

相关推荐

MDB文件读取加分页

for (Map<String, Object> map : table) {//遍历表数据。for (String enSurfaceName : tables) {//遍历所有表名。//通过表名查询所有的中文字段。

weixin_56306366的博客 250

Access分页语句

select * from 数据表名 where id between (SELECT max(id) FROM (select top 1 id from 数据表名 order by id)) and ( SELECT max(id) FROM (select top 300 id from 数据表名 order by id)) 与SQL分页方式不同,不过SQL也可以使用这种方式 Top1和T...

博客园: https://www.cnblogs.com/fger/ 2681

MFC access分页技术

根据ado技术,采用封装的分页api,具体实现如下: // CPageDlg 消息处理程序 BOOL CPageDlg::OnInitDialog() { CString strName = L"test.mdb"; CString strFullPath = _InitLocalPath(strName); if (!_IsMDBConnection(strFullPath)) { m_MDB.Close(); return FALSE;...

u011269801的专栏 606

支持accesssql语句分页,速度特快!!!

每页显示10条记录,当前显示第4页(4*10),默认按id降序排序select * from (select top 120 * from [person] order by id) temtb  order by id  desc  每页显示10条记录,当前显示第4页(4*10),按id升序排序 select  * from (select top 40 * from (select top 1

云上清风的专栏 2477

access分页查询效率问题

本文解决的问题: 1.ACCESS是否存在更有效率的分页方法? 2.现有ACCESS大数据量10万条数据分页的效率测试 3.ACCESS的数据承载量到底有多大?     相信很多ASP的站点还在使用access数据库,因为access数据库无须开专门的数据库空间,调用,迁移也方便,节省费用。另外对网站搭建者的专业能力要求也相对低一些。但随着网站的运行,数据库体积越来越大,数据量也从最初

itmaxin的专栏 892

java access 分页查询语句,Oracle、DB2、SQLSERVER、MysqlAccess分页SQL语句梳理

Oracle、DB2、SQLSERVER、MysqlAccess分页SQL语句梳理温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!最近把平时在项目中常用到的数据库分页sql总结了下。大家可以贴出分页更高效的sql语句。sqlserver分页第一种分页方法需用到的参数:pageSize 每页显...

weixin_28974337的博客 190

Access分页问题

近期打算重新写一下Noter,就先拿数据连接层来热热身,想到以后要有效展示,还是要考虑到查询结果的分页问题。 在Sql Server等支持存储过程的数据库里,分页也许会简单一点,如果是Access,虽然也是“支持”存储过程,想必要用它的“存储过程”来实现分页,会更麻烦。 在网上搜了一下,找到了一个博客转的一篇文章,里面介绍了四种方案,就我个人而言,已直接忽略了方案一与方...

weixin_30344131的博客 195

ACCESS的分页之道,Access中实现row_number() over()聚合函数功能

oracle的分页查询可以利用rowid伪列。 db2的分页查询可以利用row_number() over()聚合函数。 mysql有limit。 access仿佛先天缺陷,仅提供了top n。那如何利用top来实现分页查询呢? 假设在access中有表t1 create table t1( tc1 varchar(50) not null primary key, tc2 varchar(30)...

weixin_34290352的博客 987

转载】 yangtingkun: Oracle分页查询语句(二)

这篇文章用几个例子来说明分页查询效率。首先构造一个比较大的表作为测试表:SQL> CREATE TABLE T AS SELECT * FROM DBA_OBJECTS, DBA_SEQUENCES;表已创建。SQL&g...

cuanjian7173的博客 76

转载】 yangtingkun: Oracle分页查询格式(十二)

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。这篇介绍分析函数用于分页,且排序字段上包含索引的情况。Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/...

cuanjian7173的博客 88

转载】 yangtingkun: Oracle分页查询语句(三)

继续看查询的第二种情况,包含表连接的情况:SQL> CREATE TABLE T AS SELECT * FROM DBA_USERS;表已创建。SQL> CREATE TABLE T1 AS SELECT * FR...

cuanjian7173的博客 76

转载】 yangtingkun: Oracle分页查询语句(五)

前面的各种例子已经说明了分页查询语句的标准写法所带来的性能提升。这里简单总结一下,并简单的说明分页查询语句在何时无法带来性能提升。分页查询语句之所以可以很快的返回结果,是因为它的目标是最快的返回第一条结果。如果每页有20条记录,...

cuanjian7173的博客 91

转载】 yangtingkun: 分页查询的排序问题

前两天刚刚看完Tom的EFFECTIVE ORACLE BY DESIGN的第八章,从里面学到不是东西。同时也发现一个问题:Tom给出的关于分页以及ROWNUM的时候,几乎包含了我前几篇关于分页文章中的所有关键点。于是,打算补充...

cuanjian7173的博客 71

sql分页查询对比

sql分页查询对比 ASP.net 的DataGrid 控件的内置分页功能一直不被看好,原因是它先把所有数据从数据库读出来再进行分页。在数据量很大的情况下,用它内置的分页功能被认为几乎是不可能的事。对海量数据的读取和分页,大家会通过自定义分页来实现。其核心技术是SQL语句的设计。一般有三种方案: 方案一:(利用SQL的游标存储过程分页) create procedure XiaoZhengGe ...

我笔记 407

Access数据库查询练习专用数据库 -手机号码归属地Access数据库_MobileDB(10万条记录)...

可以进行分页查询效率测试`````Access的分页快速方法可以参看黎波的DataGrid基于Access的快速分页法 ,测量工具可以使用ACT````MobileDB.rar 下载 ACT测试的相关文章: 1.用VS.NET中的测试工具测试ASP.NET程序 2.用Microsoft Application Center Test测试Web应用程序性能 转载于:https://www.c...

weixin_30391339的博客 102

Oracle分页查询语句(五)

转载】 yangtingkun: Oracle分页查询语句(五) 2011-01-12 16:44:23 分类: Oracle 前面的各种例子已经说明了分页查询语句的标准写法所带来的性能提升。 这里简单总结一下,并简单的说明分页查询语句在何时无法带来性能提升。 分页查询语句之所以可以很快的返回结果,是因为它的目标是最快的返回第一条结果。如果每页有20条记录,目前翻到第5...

lious_xun的博客 135

ACCESS数据库分页的SQL语句

/**************************************************************/   作者:王力猛(网名:wallimn、邮件:wallimn@sohu.com)   博客:http://blog.csdn.net/wallimn   时间:2007-09-10(2008-10-04修改)   声明:此文欢迎转载转载请保留本人信息。呵呵...

数据库天地 191

简单又高效的Access分页语句

转自:http://www.ljf.cn/archives/2281 Access实现分页其实也可以在查询语句里面做。 除了流行的top分页法之外,其实还有一种更简单,更容易理解,并且效率也不低的分页法。 先来一段传统的top分页法。 SELECT TOP 10 *FROM TestTableWHERE (ID >=(SELECT MAX(id)FROM (SELECT TO...

weixin_30918633的博客 258
上一篇: TCP网络协议编程的封包和拆包
下一篇: 美好回忆
太愚散人
博客等级 码龄19年 28粉丝 52原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值