0

我有一个包含一些数据的 Access 文件。要执行某些计算,我需要使用来自原始数据的计算(生成)值创建某些表。这些临时表的大小约为每个条件 500 MB,我使用它。对于各种标准,这必须一遍又一遍地重复至少 50 次。

第一部分完成后 - 可以丢弃临时表。即使在删除行和删除表之后,Access 中的问题仍然存在,文件大小仍然很高。因此,在每次通过后,尽管丢弃了桌子,尺寸仍然会增加。很快,2GB 的墙就被击中了。

尝试过的解决方案: 1. 使用 VBA - 创建一个临时 mdb 文件 -> 在此处创建表 -> 链接到原始访问文件 - 在此处保存生成值 -> 用于计算 -> 删除文件 重新开始。

将记录插入此表非常慢。我相信因为它是一个链接表。我要做的插入数量是几十万。

  1. 使用 VBA 压缩和修复当前数据库 - 没有明确的答案。发送密钥工作 - 但失败证明。

  2. 使用单独的 accdb 文件 'control_file_ ,它将在原始访问文件、删除表、压缩和修复上完成工作,然后为下一个标准重新做一遍。请为此提供 VBA 代码。VBA 代码中的这种连续性仍然存在。

4

3 回答 3

2

我建议解决压缩数据库问题的最简单方法是简单地使用我不久前发布的代码以编程方式重新启动和压缩 MSAccess 数据库

否则,使用单独的临时数据库可能是最好的。关于性能的一件事:如果您注意保持链接表始终打开,则使用单独的链接数据库不会变慢。
使操作变慢的原因是数据库引擎需要过于频繁地创建和删除数据库锁定文件。如果您保持链接表打开(打开一个虚拟表的记录集并且不关闭它),那么锁定文件将保留并且您将获得适当的性能。

于 2013-04-22T06:37:20.637 回答
1

在 Access 2007 中的当前数据库中,压缩和修复是不可能的。您看到的所有关于此的技术要么是错误的,要么是指旧版本的 Access。

我遇到了与您相同的问题,最好的方法确实是拆分您的数据库,以便您可以在 BE 中执行计算并压缩和修复该临时数据库。此外,您在性能方面的问题实际上将使用 Renaud 的想法得到解决。

于 2013-04-29T15:48:19.700 回答
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
于 2018-04-09T16:17:24.783 回答