我有一个带有一些数据的Access文件。 要执行某些计算,我需要使用原始数据中的计算(生成)值创建某些表。 这些临时表的大小每个标准大约500 MB,我使用它。 对于各种标准,这必须一次又一次地完成至少50次。
完成第一部分后,可以丢弃临时表。 即使在删除行和删除表后,问题仍然存在,文件大小仍然很高。 结果在每次传球后,尽管桌子掉了下来,但尺寸仍然增加。 不久,2GB的墙就被击中了。
解决方案: 1.使用VBA - 创建临时mdb文件 - >在那里创建表 - >链接到原始访问文件 - 在此处保存生成值 - >用于计算 - >删除文件 再做一遍。
将记录插入此表非常慢。我相信它是一个链接表。我要做的插入数量是十万。
使用VBA压缩和修复当前数据库 - 没有明确答案。发送密钥工作 - 但失败证明。
使用单独的accdb文件'control_file_,它将对原始访问文件,删除表,压缩和修复进行操作,然后再次执行下一个条件。请告知VBA代码。 VBA代码的连续性仍然存在。
答案 0 :(得分:2)
我建议解决压缩数据库问题的最简单方法是简单地使用我前一段时间发布的Restarting and compacting an MSAccess database programmatically代码。
否则,使用单独的临时数据库可能是最好的。 但是关于性能的一件事是:如果你要保持链接表始终打开,使用单独的链接数据库并不慢 使操作变慢的原因是数据库引擎需要经常创建和删除数据库锁文件。如果保持链接表打开(将记录集打开到虚拟表并且不关闭它),则锁定文件将保留,您将获得适当的性能。
答案 1 :(得分:1)
在Access 2007的当前数据库中,无法进行压缩和修复。您看到的所有技术都是错误的,或者引用旧版本的Access。
我遇到了和你一样的问题,最好的方法就是分割你的数据库,以便你可以在BE中执行计算并压缩和修复那个临时数据库。此外,您的性能问题实际上将使用Renaud的想法来解决。
答案 2 :(得分:1)
我遇到了同样的问题,即我的数据库在原始数据导入时膨胀。我决定使用数据库对象(DAO)来创建临时数据库,导入数据,从该临时数据库中查询然后将其删除,而不是分割数据库并定期压缩后端。基本代码如下所示:
Sub tempAccessDatabaseImport()
Dim mySQL As String
Dim tempDBPath As String
Dim myWrk As DAO.Workspace
Dim tempDB As DAO.Database
Dim myObject
'Define temp access database path
tempPathArr = Split(Application.CurrentProject.Path, "\")
For i = LBound(tempPathArr) To UBound(tempPathArr)
tempDBPath = tempDBPath + tempPathArr(i) + "\"
Next i
tempDBPath = tempDBPath + "tempDB.accdb"
'Delete temp access database if exists
Set myObject = CreateObject("Scripting.FileSystemObject")
If myObject.FileExists(tempDBPath) Then
myObject.deleteFile (tempDBPath)
End If
'Open default workspace
Set myWrk = DBEngine.Workspaces(0)
'DAO Create database
Set tempDB = myWrk.CreateDatabase(tempDBPath, dbLangGeneral)
'DAO - Import temp xlsx into temp Access table
mySQL = "SELECT * INTO tempTable FROM (SELECT vXLSX.*FROM [Excel 12.0;HDR=YES;DATABASE=" & RAWDATAPATH & "].[" & WORKSHEETNAME & "$] As vXLSX)"
'DAO Execute SQL
Debug.Print mySQL
Debug.Print
tempDB.Execute mySQL, dbSeeChanges
'Do Something Else
'Close DAO Database object
tempDB.Close
Set tempDB = Nothing
myWrk.Close
Set myWrk = Nothing
'Delete temp access database if exists
If myObject.FileExists(tempDBPath) Then
'myObject.deleteFile (tempDBPath)
End If
End Sub