【发布时间】:2020-07-03 08:03:05
【问题描述】:
我有一个 MS Access 数据库。数据库版本是 2002-2003(因此是 mdb)。从该数据库中,我将几个字段导出到一个临时表中,以便在网站上表示它们。由于有一个字段包含多个逗号分隔的条目,因此我将它们拆分,以便每条记录的每个字段只有一个条目。
想象一个有以下记录的德英词典:
en | de
building | Gebäude,Bauwerk
我想这样拆分:
en | de
building | Gebäude
building | Bauwerk
我使用的 VBA 函数可以正常工作。该数据库有大约 100.000 条记录。拆分过去需要大约 30 分钟。现在需要一整天。
这是函数:
Public Sub commasplitfield4()
Dim rstObj As DAO.Recordset, dbObj As DAO.Database
Dim InsertSQL As String
Set dbObj = CurrentDb()
Set rstObj = dbObj.OpenRecordset("qry-export")
DoCmd.SetWarnings False
Do While Not rstObj.EOF
Dim memArr() As String
memArr = Split(rstObj.Fields("field4"), ",")
For i = 0 To UBound(memArr)
InsertSQL = "INSERT INTO exporttemp(field1,field2,field3,field4) VALUES (""" & rstObj.Fields("field1") _
& """, """ & rstObj.Fields("field2") _
& """, """ & rstObj.Fields("field3") & """, """ & memArr(i) & """)"
DoCmd.RunSQL (InsertSQL)
Next
rstObj.MoveNext
Loop
DoCmd.SetWarnings True
End Sub
我不能说究竟是什么时候开始需要这么长时间,但我可以说从 Windows 7 切换到 Windows 10 并没有什么不同。我在 Windows 10 上使用了很长时间,但它仍然可以正常工作。从 Access 2007 到 2010 再到 2019 也没有什么不同,至少一次没有。
为了检查错误可能在哪里,我查看了以下清单:
- 我在启动函数之前压缩了数据库
- 我尝试在 Windows 7 兼容模式下启动 Access
- 我删除了未使用的字段
- 我启动了性能分析器并进行了建议的更改(在两个字段中我更改了数据类型)
- 我将数据库拆分为仅包含表的后端和包含查询和模块的前端
- 我将后端的内容导出到一个文本文件中,然后将其重新导入到新创建的后端中
- 我在执行该功能时停止了防病毒软件(尽管防病毒软件使用了很少的处理器容量)
这些都没有显着差异。
有什么想法吗?
【问题讨论】:
-
也许您可以通过stepping through your code 缩小问题范围,并注意循环的哪一部分增加了额外的时间。
-
您是从前端运行它(即通过网络)还是直接在后端运行它?您可能还想设置一个等于
UBound(memArr)的变量并在循环中使用它,而不是每次循环时都计算这个值。 -
我正在从前端运行该功能。但在它完全是一个文件之前,它没有任何区别。我不知道如何为
Ubound(memArr)设置一个变量,避免每次都重做。 -
只声明一个变量,然后
lngLimit=UBound(memArr) | For i=0 to lngLimit. -
如果删除
SetWarnings False并使用dbObj.Execute InsertSQL, dbFailOnError而不是DoCmd.RunSQL (InsertSQL)会发生什么? Access 是否提供任何有助于解释速度缓慢的线索?
标签: vba ms-access database-performance