【问题标题】:Wouldn't MS Access(.mdb) file size reduce after deleting the content of database?删除数据库内容后 MS Access(.mdb) 文件大小不会减小吗?
【发布时间】:2010-09-14 10:54:56
【问题描述】:

我正在使用 JDBC-ODBC 驱动程序将数据插入 MS Access 数据库。空白 mdb 文件为 2KB。填充此数据库后,大小增加到 155MB。然后我正在删除数据。但是我发现 mdb 的大小仍然是 155MB。我没有收到任何错误。但是这样正常吗?我希望文件大小会减小。如果是这样设计的,它背后的想法是什么?谢谢

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    在您压缩数据库之前,MS Access 不会回收记录空间。

    作为定期维护的一部分,您应该对 access 数据库执行此操作,否则您最终会遇到一些非常痛苦的问题。

    您可以通过 MS Access UI(工具 -> 数据库实用程序 ->
    压缩和修复数据库),您可以使用以下命令提示符:

    msaccess.exe "target database.accdb" /compact 
    

    注意/Compact 开关必须在目标数据库之后

    【讨论】:

    • 在 Access 2016 中,转到“数据库工具”选项卡,然后一直单击左侧的“压缩和修复数据库”。
    【解决方案2】:

    即使在删除记录后,MS Access 也不会释放记录使用的空间。您可以在需要时手动释放空间,也可以在每次关闭应用程序时自动释放空间。

    要手动执行此操作,请使用压缩和修复实用程序:

    1. 备份您的数据库,因为有一个bug in Access 2007 可能会在压缩过程中删除您的数据库。

    2. 如果您正在压缩位于服务器或共享文件夹上的多用户(共享)数据库,请确保没有其他人打开它。

    3. 在“工具”菜单上,指向“数据库实用程序”,然后单击“压缩和修复数据库”。

    在您关闭应用程序时自动执行此操作:

    1. 打开您希望 MS Access 自动压缩的数据库。

    2. 在“工具”菜单上,单击“选项”,然后选择“常规”选项卡。

    3. 选中关闭时压缩复选框。

    删除数据并压缩数据库后,如果仍然大于 100 KB,请不要感到惊讶。第一次添加数据后,有一定的开销无法消除。

    另外,请注意 AutoNumber 字段值的行为与压缩过程后公布的不同:根据 MS Access 2000 文档,如果您从具有 AutoNumber 字段的表的末尾删除记录,压缩数据库会重置 AutoNumber 值.因此,您添加的下一条记录的自动编号值将比表中最后一条未删除记录的自动编号值大一。

    没有发现是这种情况:如果您有 100 条自动编号记录并删除最后 50 条,则下一条自动编号记录(根据文档)应编号为“51”。但根据我的经验,它的编号是“101”。

    【讨论】:

    • 在压缩之前应该备份任何 MDB,而不仅仅是在 Access 2007 中,因为一些罕见的损坏形式会导致在压缩的数据文件中仍然可以在预压缩的数据库中访问的数据丢失.这就是为什么 Access COMPACT ON CLOSE“功能”应始终关闭的原因。
    • 压缩不仅“防止坏事发生”,还促进了好事(假设您明智地选择了 PK!):“如果表中存在主键,则压缩恢复表记录到它们的主键顺序中。这提供了等效的非维护聚集索引,并使 Microsoft Jet 数据库引擎的预读功能更加高效。压缩还更新数据库中用作 Jet 优化的表统计信息查询。” (support.microsoft.com/kb/288631)
    【解决方案3】:

    如前所述,第一站应该是尝试压缩/修复数据库。但是,您也可以通过创建新数据库并从旧数据库导入所有对象来节省一些大小。

    【讨论】:

      【解决方案4】:

      您可以使用 JRO 从代码中压缩数据库。见:http://support.microsoft.com/kb/230501

      【讨论】:

      • 您不需要 JRO 来压缩数据库——DAO 工作得很好,并且在普通的 Access 应用程序中不需要添加对 JRO 的引用(或使用后期绑定进行编码)。如果您在 Access 外部使用 Jet/ACE 并且已经在使用 ADO,则 JRO 可能很有用,但如果您在 Access 内部,则首选 DAO。
      【解决方案5】:

      如前所述,第一站应该是尝试压缩/修复数据库。但是,您还可以通过创建新数据库并从旧数据库导入所有对象来节省一些大小。除此之外,将其转换为 MDE 应该会让您多发一些。与往常一样,不要玩弄你的生产副本。此外,如果您使用 MDE,请确保首先正确拆分数据库。 (当然,如果您将来需要进行修改,请保留源 MDB 的副本。)

      【讨论】:

      • 如果您只使用 MDB 来存储数据,那么将其设为 MDE 不会有任何影响,因为没有人类可读的 VBA 代码可以删除。也就是说,在 BE MDB 中,我在启动时包含了一个表单,告诉用户不要进行任何更改并包含数据库版本号。这是我保存在表中的一个值,以在用户获得新的 FE 时以编程方式更新表、字段、索引和关系时使用。
      • 只是让 OP 知道所有的可能性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2016-01-03
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多