为啥我应该关心压缩 MS Access .mdb 文件?

Posted

技术标签:

【中文标题】为啥我应该关心压缩 MS Access .mdb 文件?【英文标题】:Why should I care about compacting an MS Access .mdb file?为什么我应该关心压缩 MS Access .mdb 文件? 【发布时间】:2008-09-16 16:53:40 【问题描述】:

我们分发使用 MS Access .mdb 文件的应用程序。有人注意到,在 MS Access 中打开文件后,文件大小缩小了很多。这表明该文件非常适合压缩,但我们没有为用户提供执行此操作的方法。

所以,我的问题是,这有关系吗?我们在乎吗?如果我们的用户从不压缩数据库,会发生什么坏事?

【问题讨论】:

【参考方案1】:

除了使您的数据库更小之外,它还会重新计算表上的索引并对表进行碎片整理,从而加快访问速度。它还会发现任何不应该在您的数据库中发生但可能由于 Access 中的错误或崩溃而发生的不一致。

不过,这并非完全没有风险——bug in Access 2007 有时会在此过程中删除您的数据库。

因此,这通常是一件好事,但要搭配一个好的备份例程。备份到位后,您还可以从任何“不可恢复”的压缩包中恢复,并以最少的数据丢失修复问题。

【讨论】:

【参考方案2】:

确保您定期压缩和修复数据库,尤其是在数据库应用程序经常遇到记录更新、删除和插入的情况下。这不仅可以将数据库文件的大小保持在最低限度——这将有助于加快数据库操作和网络通信——它还可以执行数据库内务管理,这对数据的稳定性有更大的好处。但在压缩数据库之前,请确保备份文件,以防压缩出现问题。

Jet 压缩数据库以重新组织文件中的内容,以便为数据、表或索引分配的每个 4 KB“页面”(Access 95/97 为 2KB)空间位于连续区域中。 Jet 从标记为已删除的记录中恢复空间,并按照主键顺序重写每个表中的记录,就像聚集索引一样。这将使您的数据库的读/写操作更快。

Jet 还在压缩期间更新表统计信息。这包括识别每个表中的记录数,这将允许 Jet 使用最优化的方法来扫描记录,无论是使用索引还是在记录很少时使用全表扫描。压缩后,运行每个存储的查询,以便 Jet 使用这些更新的表统计信息重新优化它,从而提高查询性能。

Access 2000、2002、2003 和 2007 会在需要时将压缩与修复操作结合起来。修复过程:

1 - 清理不完整的交易

2 - 将系统表中的数据与实际表中的数据、查询和索引中的数据进行比较并修复错误

3 - 修复非常简单的数据结构错误,例如丢失指向多页记录的指针(这并不总是成功的,这也是为什么“修复”并不总是能够保存损坏的 Access 数据库的原因)

4 - 替换有关 VBA 项目结构的缺失信息

5 - 替换打开表单、报表和模块所需的缺失信息

6 - 修复表单、报告和模块中的简单对象结构错误

如果用户从不压缩/修复数据库可能发生的坏事是它会因为膨胀而变慢,并且可能变得不稳定 - 意味着损坏。

【讨论】:

Re:查询和压缩,只有前端应该有任何查询,但前端实际上不需要压缩。但是,如果后端已压缩并且表统计信息发生更改,则压缩前端会将所有已保存的查询标记为需要在下次运行时重新编译。 优秀的点,大卫。我认为在 Corey 的案例中,他没有 Access 前端,因此我们的帖子是针对适用于大多数 Access 开发人员的一般知识。【参考方案3】:

压缩 Access 数据库(也称为 MS JET 数据库)有点像对硬盘进行碎片整理。访问(或者,更准确地说,MS JET 数据库引擎)在重复使用空间方面不是很好 - 所以当更新、插入或删除记录时,空间并不总是被回收 - 相反,新空间被添加到数据库文件的末尾并改为使用。

一般的经验法则是,如果您的 [Access] 数据库将被写入(更新、更改或添加),您应该允许压缩 - 否则它增大(不仅仅是您添加的数据)。

所以,回答你的问题:

是的,这很重要(除非您的数据库是只读的)。 您应该关心(除非您关心用户的磁盘空间)。 如果您不压缩 Access 数据库,随着时间的推移,它会变得比其中的数据所显示的要大得多、多得多,从而降低性能并增加出错和损坏的可能性。 (作为基于文件的数据库,Access 数据库文件因损坏而臭名昭著,尤其是在通过网络访问时。)

如果您决定将此功能添加到您的应用中,这篇关于How to Compact Microsoft Access Database Through ADO 的文章将为您提供一个很好的起点。

【讨论】:

只有在不使用 Access 作为编程平台时,使用 ADO 进行压缩才是最佳选择。这篇好文章忽略的一件事是前端和后端之间的区别——后端(数据表)需要定期压缩,而前端不需要(因为它们不包含数据)。【参考方案4】:

我会为用户提供一种压缩数据库的方法。我已经看到数据库增长到 600+ MB,而压缩将减少到 60-80。

【讨论】:

【参考方案5】:

呼应内特: 在旧版本中,我已经损坏了数据库 - 所以一个好的备份机制是必不可少的。我不会在您的应用程序中编写任何代码来自动执行此操作。但是,如果客户发现他们的数据库运行速度非常慢,您的技术支持人员可以在需要时与他们讨论(当然需要适当的备份)。

如果他们的数据库变得如此之大以至于压缩开始成为必需品,那么也许是时候迁移到 MS-SQL 了。

【讨论】:

【参考方案6】:

我发现随着时间的推移,Access 数据库文件几乎总是会损坏。压缩和修复它们有助于将其推迟一段时间。

【讨论】:

当你在压缩之前就被破坏了,你会怎么做?我的意思是,您可以从备份中恢复,但如果您只进行每日备份,并且在一天结束之前它会损坏,您将如何处理这样的系统。正如你所说,压缩只会拖延这么久。【参考方案7】:

这真的很重要!每次操作数据时,mdb 文件的大小都会不断增加,直到达到无法承受的大小。但是您不必通过界面提供压缩方法。您可以在 mdb 文件中添加以下代码,以便在每次关闭文件时对其进行压缩:

Application.SetOption(“自动压缩”),1

【讨论】:

这是一个糟糕的主意,因为在已经处于可疑状态的数据库上进行压缩可能会丢失原本可以在压缩之前恢复的数据。 Compact On Close 应在任何情况下关闭。【参考方案8】:

我还强烈建议为您的应用程序查看 VistaDB (http://www.vistadb.net/) 或 SQL Compact(http://www.microsoft.com/sql/editions/compact/)。这些可能不适合您的应用...但绝对值得一看。

【讨论】:

这些东西都不存在了。 MSSQLExpress 是当前对 Access DB 后端的推荐。 microsoft.com/en-us/sql-server/sql-server-downloads【参考方案9】:

如果您不为您的用户提供解压方法,并且原始大小一开始就不是问题,那么请不要打扰。

【讨论】:

以上是关于为啥我应该关心压缩 MS Access .mdb 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何压缩 MS Access 数据库

编译或反编译 MS Access MDB 文件有啥作用?

MS Access - 为啥我得到空白表格

MS Access 2003 - 创建 MDE 文件失败:错误 VBA 已损坏?

MS-Access .mdb 编译器?

Delphi:在没有 Ms Access 的情况下创建 Access DB (.mdb)