设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

Access加速数据库的访问速度,33%的速度提升

2015-4-22 17:38| 发布者: admin| 查看: 2777| 评论: 8|原作者: 大熊|来自: www.office-cn.net

摘要: 下面这个窍门将教会你如何加速数据库的访问速度,当人们要读取一个数据库时往往会这么做: Do while not records.eof combo1.additem records! records.movenext loop 经常遇到的问题是每次数据 ...
下面这个窍门将教会你如何加速数据库的访问速度,当人们要读取一个数据库时往往会这么做:

Do while not records.eof

combo1.additem records![Full Name]

records.movenext

loop

经常遇到的问题是每次数据库移动到下一条记录的时候,它必须检查是否到达文件底部,这将使数据的访问速度大打折扣。当你需要在一个巨大的数据库中移动或寻找时,最好是这样做:

records.movelast

intRecCount=records.RecordCount

records.movefirst
for intCounter=1 to intRecCount
combo1.additem records![Full Name]

records.movenext

next intCounter

试试看,你将得到33%的速度提升!
发表评论

最新评论

引用 cnwang 2002-4-25 21:42
不错。
引用 tmtony 2002-4-25 22:53
写程序写到最后,就是寻求这些效果啦
引用 binbow_z 2002-4-26 03:56
好,有思路
引用 luhao 2009-3-29 12:04
本帖最后由 luhao 于 2009-3-29 12:06 编辑
下面这个窍门将教会你如何加速数据库的访问速度,当人们要读取一个数据库时往往会这么做:

Do while not records.eof

combo1.additem records![Full Name]

records.movenext

loop

经常遇到的问题 ...
大熊 发表于 2002-4-25 20:57

大熊先生,怎样去应用呀。可以发个实例吗
引用 chaojianan 2009-3-29 16:29
经验之谈,收藏了。
引用 ACMAIN_CHM 2009-3-29 18:24

其实做个实验就知道了。由于 combo1.additem records![Full Name] 这句本身对测试速度没什么影响,两种方法执行这一句效率相同。

所以问题可以简单为 for i=1 to iRecordCount 快还是 do while not rs.eof 快

我也比较好奇,第一次听到这种说法,所以做了个简单的测试如下。

测试步骤
1. 新建一空z.mdb文件, 关闭系统所有无关应用程序,打开 taskmgr.exe以便监控CPU和内存.

2. 打开z.mdb并新建一模块。 输入代码如下。

Option Compare Database
Option Explicit

Public Sub c()   '建立测试环境,建一表test,有10,000条记录。
    Dim sSQL As String
   
    sSQL = "create table test(id integer constraint pk_test primary key,c varchar(30))"
    CurrentProject.Connection.Execute sSQL
   
    Dim i As Integer
   
    For i = 1 To 10000
        sSQL = "insert into test values (" & i & ",'" & Format(i, "000000") & "')"
        CurrentProject.Connection.Execute sSQL
    Next i
   
   
End Sub


Public Sub t1()  
    Dim rs As New ADODB.Recordset
    Dim sSQL As String
    Dim iRecCount As Long
    Dim stemp As String
    Dim i As Integer
   
   
    sSQL = "select c from test"
    rs.Open sSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly
    ' 记录集为readonly时无法支持recordcount属性。因此只能用Static,
    iRecCount = rs.RecordCount
   
    For i = 1 To iRecCount
        stemp = rs.Fields(0).Value
        rs.MoveNext
    Next i
   
    rs.Close
    Set rs = Nothing
End Sub


Public Sub t2()
    Dim rs As New ADODB.Recordset
    Dim sSQL As String
    Dim stemp As String
   
   
    sSQL = "select c from test"
    rs.Open sSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
   
   
    Do While Not rs.EOF()
        stemp = rs.Fields(0).Value
        rs.MoveNext
    Loop
   
   
    rs.Close
    Set rs = Nothing
End Sub

Public Sub tt1()     '测试调用t1
    Dim i As Integer
   
    Debug.Print Now, "test recordcount started ..."
   
    For i = 1 To 100
        t1
    Next i
   
    Debug.Print Now, "test recordcount accomplished ..."

End Sub

Public Sub tt2()     '测试调用t2
    Dim i As Integer
   
    Debug.Print Now, "test EOF() started ..."
   
    For i = 1 To 100
        t2
    Next i
   
    Debug.Print Now, "test EOF() accomplished ..."
End Sub


3. 运行tt1(),tt2(),tt2(),tt1() 交替一下顺序以避免先后次序对测试的影响, 结果如下
3/29/2009 6:06:21 PM        test recordcount started ...
3/29/2009 6:06:32 PM        test recordcount accomplished ...
3/29/2009 6:06:35 PM        test EOF() started ...
3/29/2009 6:06:41 PM        test EOF() accomplished ...
3/29/2009 6:06:46 PM        test EOF() started ...
3/29/2009 6:06:52 PM        test EOF() accomplished ...
3/29/2009 6:06:55 PM        test recordcount started ...
3/29/2009 6:07:06 PM        test recordcount accomplished ...


结论: (windows 2000 sp4 + access 2003 sp3, CPU 2GHz, MEM 2GB)
在对10000记录的 1000次循环中
eof 耗时为约 6s, recordcount 耗时为约 11s

如果将eof的记录集方式也换成 adOpenStatic 即在 t2()中改成如下
rs.Open sSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly

则测试结果
3/29/2009 6:07:45 PM        test recordcount started ...
3/29/2009 6:07:56 PM        test recordcount accomplished ...
3/29/2009 6:08:01 PM        test EOF() started ...
3/29/2009 6:08:11 PM        test EOF() accomplished ...
3/29/2009 6:08:15 PM        test EOF() started ...
3/29/2009 6:08:26 PM        test EOF() accomplished ...
3/29/2009 6:08:29 PM        test recordcount started ...
3/29/2009 6:08:40 PM        test recordcount accomplished ...


测试数据表明两者无明显差异。


******************
*  一切皆有可能  *
******************

.
ACMAIN - Access论坛回贴准则(个人).
.


引用 tz-chf 2009-3-29 19:42
接7楼的话,我想也是,测一个eof属性也不是楼主说的什么到底部。我都用do的。
引用 narcissus82 2009-3-30 14:21
都是高手阿,汗颜

查看全部评论(8)

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-20 12:26 , Processed in 0.101781 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部