Office中国论坛/Access中国论坛

标题: 同样方法操作,速度相差很多 [打印本页]

作者: zhufree    时间: 2011-11-1 13:22
标题: 同样方法操作,速度相差很多
同样的AD0程序,123文件记录数不到1W条,但操作要10多秒,
db1文件记录数20多w条,操作只要3秒左右。不知道哪边出现了问题,请指教!谢谢1
作者: t小宝    时间: 2011-11-1 13:52
123循环的记录集:"select 表_指令调拨表.流水号 from 表_指令调拨表 group by 表_指令调拨表.流水号 order by 表_指令调拨表.流水号"
有5737条记录,
db1循环的记录集:“select tbl.pycode from tbl group by tbl.pycode order by tbl.pycode”
只有484条记录。
谁快谁慢不就很清楚了。
作者: yangruihao    时间: 2011-11-1 15:48
t小宝 发表于 2011-11-1 13:52
123循环的记录集:"select 表_指令调拨表.流水号 from 表_指令调拨表 group by 表_指令调拨表.流水号 order ...

小宝老师好厉害
作者: zhufree    时间: 2011-11-1 16:33
t小宝 发表于 2011-11-1 13:52
123循环的记录集:"select 表_指令调拨表.流水号 from 表_指令调拨表 group by 表_指令调拨表.流水号 order ...

T小宝解释的是。
但想请问下,这个速度如何可以再提升下?谢谢
作者: t小宝    时间: 2011-11-1 20:58
使用这个函数,速度可以提高大概三分之一。
合并记录为字符串的一个函数
代码如下:
  1. Sub CMDPRINT_Click()

  2.     CurrentDb.Execute "delete * from 表_调拨明细"
  3.     t = Timer
  4.     CurrentDb.Execute "INSERT INTO 表_调拨明细( 流水号, 调拨明细 ) SELECT 表_指令调拨表.流水号, " & _
  5.         "DMerge('调出单号 & 半成品数量 & 备注','表_指令调拨表','流水号=' & [流水号] & '',',') " & _
  6.         " FROM 表_指令调拨表 GROUP BY 流水号 ORDER BY 流水号"

  7.     MsgBox "秏时: " & Timer - t & " 秒"

  8. End Sub

  9. Public Function DMerge(Exps As String, Domain As String, _
  10.     Optional Criteria As String, Optional Separator As String = ";") As String
  11.    
  12. '函数功能:  合并指定记录集指定字段值为一个字符串
  13. '参数说明:
  14. '  expr :         要合并的字段
  15. '  domain :     来源表或查询
  16. '  criteria :      可选,限制记录的条件表达式
  17. '  Separator : 可选,合并记录的分隔符,默认为分号(;)
  18. '
  19. '调用示例:  DMerge("姓名","人员表","性别='" & [性别] & "'",Chr(13) & Chr(10))
  20. '                以上示例在查询中,使用了换行分隔符,返回换行显示的姓名
  21. '作      者:  t小雨
  22. '创建时间:  2009/11/25

  23. On Error Resume Next
  24.     Dim rst As New ADODB.Recordset
  25.     Dim strSql As String
  26.    
  27.     strSql = "Select " & Exps & " From " & Domain
  28.     If Criteria <> "" Then strSql = strSql & " Where " & Criteria
  29.     rst.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText
  30.    
  31.     If Not rst.EOF Then DMerge = rst.GetString(adClipString, , , Separator)
  32.     rst.Close
  33.     Set rst = Nothing
  34. End Function

复制代码

作者: zhufree    时间: 2011-11-2 11:34
t小宝 发表于 2011-11-1 20:58
使用这个函数,速度可以提高大概三分之一。
合并记录为字符串的一个函数
代码如下:

谢谢,速度是有提高约1/3

在EXCEL中字典速度一秒都不到,ACCESS中是否有类似功能
作者: roych    时间: 2011-11-2 21:23
Access也有字典功能。。。红尘写过实例。搜索下?
作者: zhufree    时间: 2011-11-2 21:45
roych 发表于 2011-11-2 21:23
Access也有字典功能。。。红尘写过实例。搜索下?

我在测试,谢谢
作者: zhufree    时间: 2011-11-2 21:56
roych 发表于 2011-11-2 21:23
Access也有字典功能。。。红尘写过实例。搜索下?

凑写了一个,一二秒时间能计算出。还得稍完善下。
作者: roych    时间: 2011-11-2 22:58
直接执行查询也不见得很慢。就本例而言,在我的系统里测试,似乎是直接执行追加查询比字典功能或者ADO都要快些许(其中ADO更慢些)。
[attach]47200[/attach]
作者: t小宝    时间: 2011-11-2 23:39
这个代码似乎快一点点
  1. Sub macro2()

  2. Dim arr2()
  3. Dim i As Integer
  4. Dim a As Integer
  5. Dim s As String
  6. Dim e As Double

  7. Dim rs As ADODB.Recordset

  8. CurrentDb.Execute "delete * from 表_调拨明细"

  9. e = Timer
  10. arr2 = CurrentProject.Connection.Execute("SELECT * FROM 表_指令调拨表 order by 流水号").getrows
  11. a = UBound(arr2, 2)

  12. Set rs = New ADODB.Recordset
  13. sql = "select * from 表_调拨明细"

  14. With rs
  15.     .Open sql, CurrentProject.Connection, 3, 3
  16.     For i = 0 To a
  17.         If i = 0 Then
  18.             s = arr2(1, i) & arr2(2, i) & arr2(3, i)
  19.         ElseIf arr2(0, i) = arr2(0, i - 1) Then
  20.             s = s & "," & arr2(1, i) & arr2(2, i) & arr2(3, i)
  21.         ElseIf arr2(0, i) <> arr2(0, i - 1) Then
  22.             .AddNew
  23.                 rs("流水号") = arr2(0, i - 1)
  24.                 rs("调拨明细") = s
  25.            .Update
  26.            s = arr2(1, i) & arr2(2, i) & arr2(3, i)
  27.         End If
  28.     Next
  29.      .AddNew
  30.          rs("流水号") = arr2(0, a)
  31.          rs("调拨明细") = s
  32.     .Update

  33.     MsgBox a + 1 & " " & Timer - e
  34. End With

  35. End Sub
复制代码

作者: zhufree    时间: 2011-11-3 06:52
t小宝 发表于 2011-11-2 23:39
这个代码似乎快一点点

数组操作看起来更易懂
作者: xyhecho2002    时间: 2012-1-21 09:48
roych 发表于 2011-11-2 22:58
直接执行查询也不见得很慢。就本例而言,在我的系统里测试,似乎是直接执行追加查询比字典功能或者ADO都要快 ...

学习下




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3