Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Access 2007中数据的物理存储_Database_Ms Access_Ms Access 2007 - Fatal编程技术网

Database Access 2007中数据的物理存储

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

我一直在尝试估计具有一定数量记录的访问表的大小

它有4个长(每个4字节)和一个货币(8字节)

理论上:
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索引的额外开销很少),但是其他索引会增加很大的比例,特别是对于这些类型的字段,其中,索引大小将是该字段的实际数据占用的空间的重要部分。尝试删除数据库副本上的所有索引,然后查看结果。