【问题标题】:Why is my Access 2007 database growing so much?为什么我的 Access 2007 数据库增长如此之快?
【发布时间】:2013-11-06 22:35:20
【问题描述】:

我正在开发一个 Win32 应用程序,该应用程序开发了一个非常奇怪的问题,即数据库悄悄地增长,直到最终达到 2 GB 文件大小限制。我们使用 ADO 连接到 Access 2007 数据库。该应用程序多年来一直运行良好,没有观察到这样的困难。正如您可能想象的那样,当它达到 2 GB 的限制时,数据库就会损坏。我现在有很多客户数据库被发送给我们进行维修——大小都在 2GB 左右。压缩后,它们会回到

随着时间的推移,我们看到了一些数据库增长,但从未出现过这种规模的增长。

我制作了一个小型数据库“检查器”,它将所有记录中所有字段的内容相加,以了解存在多少实际数据。在最近压缩的数据库上检查了这个新工具后,我认为该工具工作正常。所有臃肿的数据库每个数据都不超过 10 MB。

我们不会在应用启动时压缩数据库。在我看来,因为我们不删除大量数据,所以压缩数据库不是我们“应该”需要做的事情。拥有较大数据库的客户(有一些,但它们使用的是早期版本)。

您能否建议我们如何让一个小于 10 MB 的数据库增长到 2 GB?

关于我们的应用功能的几点说明:

  • 当 ADO 没有打开数据库时,使用 DAO 完成任何重组。

  • 我们确实在一些地方使用交易

  • 为方便起见,某些记录便于删除和重新创建,而不是查找/编辑/删除。通常此操作涉及 5-30 条记录,每条记录约 8K。这仅在用户按下“保存”时发生。

  • 还有其他大约 70 KB/记录的记录类型,但我们没有对它们使用删除/重新创建。

  • 我们使用 BLOB(“OLEObject”)字段来存储二进制数据。

感谢您提供的任何见解。

【问题讨论】:

  • 这应该被标记为 Delphi 吗?
  • 我考虑过不将其标记为 Delphi,因为我真的不认为这有什么不同,但为了充分披露,我还是提到了它。
  • 您能否定期检查数据库磁盘上的大小并在自上次检查后增长超过 X % 时对其进行压缩? (显然以某种方式考虑了数据库表中的记录数)。
  • 正如@Jerry 所说,这个问题真的与Delphi 无关。这严格来说是一个 Access/ADO 问题。这里没有与 Delphi 相关的内容。支持内容问题,但删除 delphi 标签。
  • 我在使用 SQL Server 时也遇到过类似的问题。执行数据库更新脚本(超过 30k 行脚本)后,日志文件变得异常大。实际上,我们在更新过程中加入了收缩过程来适应这种情况。

标签: ms-access ms-access-2007 ado


【解决方案1】:

MS Access 文件很容易膨胀。它们存储了大量的交易历史,以及在记录删除期间保留大小。 当我使用 Access 数据库编写应用程序时,我会在设计中考虑定期压缩,因为这是使数据库保持一致的唯一方法。 关闭时压缩可能会出现问题(取决于环境),例如用户强迫压缩中止,因为他们希望他们的计算机在一天结束时完成关闭。同样,compact on open 会导致令人沮丧的延迟,用户想进入程序但不能。 我通常会尝试和组织将压缩作为计划任务在始终在线的 PC(例如服务器)上完成。请点击链接了解更多信息:http://support.microsoft.com/kb/158937

【讨论】:

    【解决方案2】:

    感谢大家的帮助。找到它发生的地方:

    var
      tbl:ADOX_TLB.Table;
      cat:ADOX_TLB.Catalog;
      prop:ADOX_TLB.Property_;
    begin
      cat:=ADOX_TLB.CoCatalog.Create;
    
      cat.Set_ActiveConnection(con.ConnectionObject);
    
      // database growth here
      tbl:=cat.Tables.Item[sTableName];
    
      prop:=tbl.Properties['ValidationText'];
    
      Result:=prop.Value;
    
      prop:=nil;
      tbl:=nil;
      cat:=nil;
    end;
    

    每次调用这个函数,数据库都会增长大约 32KB。

    我改用 DAO 而不是 ADO 来减少执行此功能的频率。

    【讨论】:

      【解决方案3】:

      所以做了一些研究,我遇到了a discussion,关于 MS Access 文件将如何增长直到压缩,即使数据被删除。由此我推断他们将交易历史存储在文件中。这意味着它们将随着每次访问而继续增长。

      解决方案是压缩。您显然需要定期压缩数据库。如果需要很长时间,您可能希望在应用程序关闭时执行此操作,而不是启动。

      另外请注意,这意味着多操作更改(例如上面提到的删除然后重新插入修改后的值)可能会导致文件更快地扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 2019-03-28
        • 2021-07-03
        • 1970-01-01
        相关资源
        最近更新 更多