【发布时间】:2008-09-16 16:53:40
【问题描述】:
我们分发使用 MS Access .mdb 文件的应用程序。有人注意到,在 MS Access 中打开文件后,文件大小缩小了很多。这表明该文件非常适合压缩,但我们没有为用户提供执行此操作的方法。
所以,我的问题是,这有关系吗?我们在乎吗?如果我们的用户从不压缩数据库,会发生什么坏事?
【问题讨论】:
标签: ms-access
我们分发使用 MS Access .mdb 文件的应用程序。有人注意到,在 MS Access 中打开文件后,文件大小缩小了很多。这表明该文件非常适合压缩,但我们没有为用户提供执行此操作的方法。
所以,我的问题是,这有关系吗?我们在乎吗?如果我们的用户从不压缩数据库,会发生什么坏事?
【问题讨论】:
标签: ms-access
除了使您的数据库更小之外,它还会重新计算表上的索引并对表进行碎片整理,从而加快访问速度。它还会发现任何不应该在您的数据库中发生但可能由于 Access 中的错误或崩溃而发生的不一致。
不过,这并非完全没有风险——bug in Access 2007 有时会在此过程中删除您的数据库。
因此,这通常是一件好事,但要搭配一个好的备份例程。备份到位后,您还可以从任何“不可恢复”的压缩包中恢复,并以最少的数据丢失修复问题。
【讨论】:
确保您定期压缩和修复数据库,尤其是在数据库应用程序经常遇到记录更新、删除和插入的情况下。这不仅可以将数据库文件的大小保持在最低限度——这将有助于加快数据库操作和网络通信——它还可以执行数据库内务管理,这对数据的稳定性有更大的好处。但在压缩数据库之前,请确保备份文件,以防压缩出现问题。
Jet 压缩数据库以重新组织文件中的内容,以便为数据、表或索引分配的每个 4 KB“页面”(Access 95/97 为 2KB)空间位于连续区域中。 Jet 从标记为已删除的记录中恢复空间,并按照主键顺序重写每个表中的记录,就像聚集索引一样。这将使您的数据库的读/写操作更快。
Jet 还在压缩期间更新表统计信息。这包括识别每个表中的记录数,这将允许 Jet 使用最优化的方法来扫描记录,无论是使用索引还是在记录很少时使用全表扫描。压缩后,运行每个存储的查询,以便 Jet 使用这些更新的表统计信息重新优化它,从而提高查询性能。
Access 2000、2002、2003 和 2007 会在需要时将压缩与修复操作结合起来。修复过程:
1 - 清理不完整的交易
2 - 将系统表中的数据与实际表中的数据、查询和索引中的数据进行比较并修复错误
3 - 修复非常简单的数据结构错误,例如丢失指向多页记录的指针(这并不总是成功的,这也是为什么“修复”并不总是能够保存损坏的 Access 数据库的原因)
4 - 替换有关 VBA 项目结构的缺失信息
5 - 替换打开表单、报表和模块所需的缺失信息
6 - 修复表单、报告和模块中的简单对象结构错误
如果用户从不压缩/修复数据库可能发生的坏事是它会因为膨胀而变慢,并且可能变得不稳定 - 意味着损坏。
【讨论】:
压缩 Access 数据库(也称为 MS JET 数据库)有点像对硬盘进行碎片整理。访问(或者,更准确地说,MS JET 数据库引擎)在重复使用空间方面不是很好 - 所以当更新、插入或删除记录时,空间并不总是被回收 - 相反,新空间被添加到数据库文件的末尾并改为使用。
一般的经验法则是,如果您的 [Access] 数据库将被写入(更新、更改或添加),您应该允许压缩 - 否则它将增大(不仅仅是您添加的数据)。
所以,回答你的问题:
如果您决定将此功能添加到您的应用中,这篇关于How to Compact Microsoft Access Database Through ADO 的文章将为您提供一个很好的起点。
【讨论】:
我会为用户提供一种压缩数据库的方法。我已经看到数据库增长到 600+ MB,而压缩将减少到 60-80。
【讨论】:
呼应内特: 在旧版本中,我已经损坏了数据库 - 所以一个好的备份机制是必不可少的。我不会在您的应用程序中编写任何代码来自动执行此操作。但是,如果客户发现他们的数据库运行速度非常慢,您的技术支持人员可以在需要时与他们讨论(当然需要适当的备份)。
如果他们的数据库变得如此之大以至于压缩开始成为必需品,那么也许是时候迁移到 MS-SQL 了。
【讨论】:
我发现随着时间的推移,Access 数据库文件几乎总是会损坏。压缩和修复它们有助于将其推迟一段时间。
【讨论】:
这真的很重要!每次操作数据时,mdb 文件的大小都会不断增加,直到达到无法承受的大小。但是您不必通过界面提供压缩方法。您可以在 mdb 文件中添加以下代码,以便在每次关闭文件时对其进行压缩:
Application.SetOption(“自动压缩”),1
【讨论】:
我还强烈建议为您的应用程序查看 VistaDB (http://www.vistadb.net/) 或 SQL Compact(http://www.microsoft.com/sql/editions/compact/)。这些可能不适合您的应用...但绝对值得一看。
【讨论】:
如果您不为您的用户提供解压方法,并且原始大小一开始就不是问题,那么请不要打扰。
【讨论】: