Database Access 2007中数据的物理存储
我一直在尝试估计具有一定数量记录的访问表的大小 它有4个长(每个4字节)和一个货币(8字节) 理论上:Database Access 2007中数据的物理存储,database,ms-access,ms-access-2007,Database,Ms Access,Ms Access 2007,我一直在尝试估计具有一定数量记录的访问表的大小 它有4个长(每个4字节)和一个货币(8字节) 理论上:1条记录=24字节,500000=~11.5MB 但是,accdb文件(即使在压缩之后)增加了近30MB(每个记录约61字节)。多加几个字节来填充就没那么糟糕了,但2.5X似乎有点过分了——即使对于微软的膨胀来说也是如此 差异是怎么回事?这四个长键是复合键,有关系吗?这是我测试的结果,所有测试都是使用A2003 MDB进行的,而不是A2007 ACCDB: 98,304 IndexT
1条记录=24字节,500000=~11.5MB
但是,accdb文件(即使在压缩之后)增加了近30MB(每个记录约61字节)。多加几个字节来填充就没那么糟糕了,但2.5X似乎有点过分了——即使对于微软的膨胀来说也是如此
差异是怎么回事?这四个长键是复合键,有关系吗?这是我测试的结果,所有测试都是使用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()的append查询来附加524288条假数据记录,这使得文件的大小为11MBs。我在其他字段上创建的索引都是非唯一的。但是,如果您看到复合4列索引,那么大小将从11MBs(无索引)增加到远远超过24MBs。第一列上的PK只会将大小从11MBs增加到15.4MBs(当然,使用假的MBs,即与硬盘驱动器制造商一样)
请注意,每个单列索引是如何将文件大小增加大约4MB的。如果您认为没有索引的4列总数为11MbS,那么基于上面的注释,这似乎是正确的,即,每个索引都应该增加文件大小,而不是索引字段中的数据量。我很惊讶聚集索引也做到了这一点——我原以为聚集索引会占用更少的空间,但事实并非如此
相比之下,第一列上的非PK(即非聚集)唯一索引(从IndexTestNoIndexes.mdb开始)与第一列作为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.5 MB,其索引又增加了4 MB。如果我将非唯一索引添加到第2、第3和第4个长字段中,则数据库41336832的大小将增加到略低于12MB(或每增加一个索引~4MB)
所以,这基本上复制了你的结果,不是吗?粗略地说,我最终得到了相同的文件大小
您的问题的答案是索引,尽管A2007 ACCDB格式的开销明显更大,因为我看到的是大小仅增加了20MB,而不是30MB
我注意到的一件事是,我可以实现一个索引,使文件变大,然后删除索引并压缩,它将恢复到与以前完全相同的文件大小,因此,您应该能够获取数据库的一个副本,并试验删除索引对文件大小的影响。有索引吗?PK不应该增加太多的大小(表聚集在PK上,除了表存储本身之外,维护PK索引的额外开销很少),但是其他索引会增加很大的比例,特别是对于这些类型的字段,其中,索引大小将是该字段的实际数据占用的空间的重要部分。尝试删除数据库副本上的所有索引,然后查看结果。