这是我的测试结果,全部使用 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,根据我上面的评论,这似乎是正确的,即每个索引应该将文件大小增加大约被索引字段中的数据量。我很惊讶于聚集索引也这样做了——我认为聚集索引会使用更少的空间,但事实并非如此。
为了比较,从 IndexTestNoIndexes.mdb 开始的第一列上的非 PK(即非聚集)唯一索引与第一列作为 PK 的数据库的大小完全相同,因此不会节省空间完全来自聚集索引。如果索引字段的序号位置可能会有所不同,我还尝试了仅在第二列上的唯一索引,结果完全相同。
现在,我没有仔细阅读您的问题,并省略了货币字段,但是如果我将其添加到非索引表和具有复合索引的表中并用随机数据填充它,我会得到:
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。如果我将非唯一索引添加到第 2、第 3 和第 4 个长字段,则数据库为 41,336,832,并且大小增加不到 12MB(或每个附加索引约 4MB)。
所以,这基本上复制了您的结果,不是吗?粗略地说,我最终得到了相同的文件大小。
您的问题的答案是 INDEXES,尽管 A2007 ACCDB 格式显然有更多开销,因为我看到大小仅增加了 20MB,而不是 30MB。
我确实注意到的一件事是,我可以实现一个使文件变大的索引,然后删除索引并压缩,它会恢复到与以前完全相同的文件大小,所以你应该能够获取数据库的单个副本并尝试删除索引对文件大小的影响。