5

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

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

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

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

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

关于我们的应用程序所做的一些评论:

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

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

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

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

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

感谢您提供的任何见解。

4

3 回答 3

2

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

于 2013-11-06T22:58:51.640 回答
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 来减少执行此功能的频率。

于 2013-11-28T18:39:58.893 回答
1

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

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

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

于 2013-11-06T22:47:28.240 回答