我一直在尝试估算具有一定数量记录的Access表的大小。
它有4个Longs(每个4个字节)和一个Currency(8个字节)。
理论上:1 Record = 24 bytes, 500,000 = ~11.5MB
然而,accdb文件(即使在压缩后)也增加了近30MB(每条记录约61个字节)。填充的一些额外字节不会那么糟糕,但2.5X似乎有点过分 - 即使对于微软膨胀。
有什么不一样的地方?这四个长点是复合键,这有关系吗?
答案 0 :(得分:2)
这是我的测试结果,所有测试均使用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字段,但是如果我将它添加到非索引表和带有复合索引的表并用随机数据填充它,我得到这个:< / p>
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)。
所以,这基本上会复制你的结果,不是吗?我粗略地谈到了文件大小。
你的问题的答案是INDEXES,虽然A2007 ACCDB格式显然有更多的开销,因为我看到只增加了20MB,而不是30MB。
我注意到的一件事是我可以实现一个索引,使文件变大,然后删除索引和压缩,它将返回到与以前完全相同的文件大小,所以你应该能够获取数据库的单个副本,并试验删除索引对文件大小的影响。