我在一个Win32应用程序上工作,该应用程序已经开发出一个非常奇怪的数据库问题,直到它最终达到2 GB的文件大小限制。我们使用ADO连接到Access 2007数据库。该应用程序已经很好地工作多年,没有观察到这样的困难。如您所想,当它达到2 GB的限制时,数据库就会损坏。我现在有很多客户数据库被发送给我们进行维修 - 大小约为2GB。一旦压缩,他们回到< 10 MB。
我们看到一些数据库随着时间的推移而增长,但从未在这种规模上增长。
我创建了一个小型数据库“checker”,它将所有记录中所有字段的内容相加,以便了解存在多少实际数据。在最近已经压缩的数据库上检查了这个新工具后,我认为该工具正常工作。所有膨胀的数据库每个都有不超过10 MB的数据。
我们不会在应用启动时压缩数据库。在我看来,因为我们不删除大量数据,所以压缩数据库不是我们“应该”需要做的事情。拥有较大数据库的客户(有一些但是它们在早期版本中)。
您能否建议我们如何将数据库<10 MB扩展到2 GB?
关于我们的应用程序的作用的一些评论:
当ADO没有打开数据库时,使用DAO完成任何重组。
我们确实在少数地方使用交易
为方便起见,某些记录便于删除和重新创建,而不是查找/编辑/删除。通常,此操作涉及5-30条记录,每条记录大约8K。只有当用户按下“保存”时才会出现这种情况。
还有其他记录类型约为70 KB /记录,但我们没有使用删除/重新创建。
我们使用BLOB(“OLEObject”)字段来存储二进制数据。
感谢您提供的任何见解。
答案 0 :(得分:2)
MS Access文件非常容易膨胀。它们存储了大量的交易历史记录,并在记录删除期间保留了大小。 当我使用Access数据库编写应用程序时,我会将常规压缩因素考虑到设计中,因为这是使数据库保持一致的唯一方法。 在关闭时压缩可能会出现问题(取决于环境),例如用户迫使压缩程序中止,因为他们希望计算机在一天结束时完成关闭。同样,打开时紧凑可能导致用户想要进入程序但却无法进入程序的令人沮丧的延迟。 我通常会尝试组织紧凑型作为计划任务在一台永远在线的PC上完成,例如服务器。请点击此链接获取更多信息:http://support.microsoft.com/kb/158937
答案 1 :(得分: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。
答案 2 :(得分:1)
所以做了一些研究,我遇到a discussion关于MS Access文件如何增长直到压缩,即使数据被删除。据此我推断他们将事务历史存储在文件中。这意味着它们将随着每次访问而继续增长。
解决方案是压缩。您显然需要定期压缩数据库。您可能希望在应用程序关闭时执行此操作,而不是在需要很长时间时启动。
另请注意,这意味着多操作更改(例如删除然后重新插入上面提到的修改后的值)可能会导致文件更快地扩展。