- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在尝试估算具有一定数量记录的 Access 表的大小。
它有 4 个 Long(每个 4 个字节)和一个 Currency(8 个字节)。
理论上:1 条记录 = 24 字节,500,000 = ~11.5MB
但是,accdb 文件(即使在压缩之后)增加了近 30MB(每条记录约 61 字节)。用于填充的一些额外字节不会那么糟糕,但 2.5X 似乎有点过分 - 即使对于 Microsoft 膨胀也是如此。
有什么差异?四个 long 是复合键,这有关系吗?
最佳答案
这是我的测试结果,所有测试均使用 A2003 MDB 而不是 A2007 ACCDB:
98,304 IndexTestEmpty.mdb
131,072 IndexTestNoIndexesNoData.mdb
11,223,040 IndexTestNoIndexes.mdb
15,425,536 IndexTestPK.mdb
19,644,416 IndexTestPKIndexes1.mdb
23,838,720 IndexTestPKIndexes2.mdb
24,424,448 IndexTestPKCompound.mdb
28,041,216 IndexTestPKIndexes3.mdb
28,655,616 IndexTestPKCompoundIndexes1.mdb
32,849,920 IndexTestPKCompoundIndexes2.mdb
37,040,128 IndexTestPKCompoundIndexes3.mdb
我认为这些名称应该是不言自明的。我使用带有 Rnd() 的追加查询来追加 524,288 条虚假数据记录,这使文件变成了 11MB。我在其他字段上创建的索引都是非唯一的。但是,如果您看到复合 4 列索引的大小从 11MB(无索引)增加到远远超过 24MB。第一列的 PK 仅将大小从 11MB 增加到 15.4MB(当然使用假 MB,即,如硬盘制造商)。
请注意每个单列索引如何使文件大小增加大约 4MB。如果你认为没有索引的 4 列总计 11MB,根据我上面的评论,这似乎是正确的,即每个索引应该增加文件大小,大约是被索引字段中的数据量。我很惊讶于聚簇索引也这样做了 -- 我认为聚簇索引会使用更少的空间,但事实并非如此。
为了比较,第一列上的非 PK(即非聚集)唯一索引,从 IndexTestNoIndexes.mdb 开始,与第一列作为 PK 的数据库的大小完全相同,因此没有空间节省完全来自聚簇索引。万一索引字段的顺序位置可能会有所不同,我还尝试了仅在第二列上使用唯一索引,结果大小完全相同。
现在,我没有仔细阅读您的问题,并省略了 Currency 字段,但如果我将其添加到非索引表和具有复合索引的表中并用随机数据填充它,我会得到这个:
98,304 IndexTestEmpty.mdb
131,072 IndexTestNoIndexesNoData.mdb
11,223,040 IndexTestNoIndexes.mdb
15,425,536 IndexTestPK.mdb
15,425,536 IndexTestIndexUnique2.mdb
15,425,536 IndexTestIndexUnique1.mdb
15,482,880 IndexTestNoIndexes+Currency.mdb
19,644,416 IndexTestPKIndexes1.mdb
23,838,720 IndexTestPKIndexes2.mdb
24,424,448 IndexTestPKCompound.mdb
28,041,216 IndexTestPKIndexes3.mdb
28,655,616 IndexTestPKCompoundIndexes1.mdb
28,692,480 IndexTestPKCompound+Currency.mdb
32,849,920 IndexTestPKCompoundIndexes2.mdb
37,040,128 IndexTestPKCompoundIndexes3.mdb
比较的要点是:
11,223,040 IndexTestNoIndexes.mdb
15,482,880 IndexTestNoIndexes+Currency.mdb
24,424,448 IndexTestPKCompound.mdb
28,692,480 IndexTestPKCompound+Currency.mdb
因此,货币字段又增加了 4.5MB,其索引又增加了 4MB。如果我将非唯一索引添加到第二个、第三个和第四个长字段,数据库将增加 41,336,832,并且大小增加将近 12MB(或每个附加索引约 4MB)。
那么,这基本上复制了您的结果,不是吗?粗略地说,我最终得到了相同的文件大小。
您的问题的答案是索引,尽管 A2007 ACCDB 格式的开销明显更多,因为我看到大小仅增加了 20MB,而不是 30MB。
我确实注意到的一件事是我可以实现一个索引使文件变大,然后删除索引并压缩,它会恢复到与以前完全相同的文件大小,因此您应该能够获取数据库的单个副本并试验删除索引对文件大小的影响。
关于database - Access 2007 中数据的物理存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484908/
我正在尝试编写 Access Access 数据库的脚本,以便在命令行上使用。 Access 数据库使用工作组文件进行保护。 Dim oApp, sWGF,myWS Set sApp = Create
我有一个包含数据表的表格。我希望用户能够选择多行,单击按钮并运行一些 sql 查询并对这些行执行一些工作。 查看我的 VBA 代码,我发现如何使用 CurrentRecord 属性 Access 最后
如果我在某个网络位置有 Microsoft Access 2007 数据库,那么可以使用该数据库的客户端计算机的数量是否有限制?客户端不会安装 Access,而是使用 Access Runtime 2
我正在开发一个注册系统。但我收到此错误:You tried to execute a query that does not include the specified expression.. 我正
我有一个产品设计为使用 MS Access 文件作为数据库的桌面产品。 现在,一些用户需要将它安装在几台 PC(比如说 2 或 3 台)上并共享数据库。 我想将 MS Access 文件放在共享文件夹
我接手了一个旧的软件项目,该项目使用 MS Access 数据库来存储数据。但是数据库不会在 Access 中打开,如下所示: "You do not have the necessary permi
我有一个文件夹,里面装满了 100 多个 Access97 文件。我需要将它们全部更新到 Access2003。 我可以手动完成,但使用 VBA 可能会快很多。 有没有人会有一个片段可以做到这一点?或
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。 一个连续的表单在加
我的公司用 Visual Basic 6 开发了一个应用程序。 该应用程序通过 ODBC 数据源使用 Access 数据库。 Access 数据库是一个扩展名为“.mdb”的文件。 在以下环境中运行应
我一直在尝试让 Microsoft Access 从主 Access 窗口中“退出”,以便我可以隐藏 Access 窗口并仅在桌面上显示表单,以便可以轻松地将其放置在其他应用程序旁边。 起初我发现了一
我想在 access 2010 中使用 access 2000 和 2003 数据库。由于我不想检查一切是否手动工作,我正在寻找一种工具来分析 VBA 代码以查找使用 access 2010 发生的错
所以我有一个 Excel 工作簿,其中有一个很好的 shaperange 对象的全局 map 。通过一些非常简单的代码,我可以更改颜色、将国家/地区集合分组和取消分组为数组等......并且效果非常好
我们希望有大约 35-40 人通过共享驱动器上的脚本写入 Access 数据库。这些指标分解为他们需要每小时写大约 3-7 次。 Access 会支持这一点而不会对我产生影响吗? 是的,我很乐意将其用
我正在寻找一种使用 VBA 代码从外部数据库文件中删除 VBA 模块的方法。名为“myfile.accdb”的外部文件有一个名为“mod1”的模块,我希望能够在单独的项目中使用 VBA 代码删除该模块
我在 Access 2003 数据库(在 Access 2007 中开发)中有三个表单,它们处于父级 -> 子级 -> 孙子级关系中。在子窗体的 'Form_Load' 子窗体中,我设置了孙子窗体的一
MS Access 2007 存在拒绝在设计模式下显示表单的问题。我可以看到表单的代码(如果我查看显示表单的按钮的事件属性),但我看不到作为 GUI 布局的表单。而且,当我尝试从应用程序的主窗口调用此
我编写了代码,使用 Excel 中的下拉列表提供的标准将两个表连接起来,然后将数据返回到电子表格上的特定位置(工作表上已经有标题)。 这在我的机器上和其他机器上使用 MS Access 的机器上都可以
我正在开始构建一个应用程序,该应用程序从给定的根路径开始遍历文件夹结构,并将所有找到的 Access 1997 .mdb 文件转换为较新的 Access 2007/2010 .accdb 格式。但是,
我有一个表单和一个按钮。我想通过单击按钮打开另一个表单,并将参数从父表单传递到子表单(子表单的 RecordSource 有参数)。我该怎么做? 最佳答案 您可以通过引用表单的对象来引用调用表单的任何
我是一名优秀的程序员,十分优秀!