【问题标题】:Physical storage of data in Access 2007Access 2007 中数据的物理存储
【发布时间】:2010-03-20 21:46:54
【问题描述】:

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

它有 4 个 Long(每个 4 个字节)和一个 Currency(8 个字节)。

理论上:1 Record = 24 bytes, 500,000 = ~11.5MB

但是,accdb 文件(即使在压缩之后)增加了近 30MB(每条记录约 61 个字节)。一些额外的填充字节不会那么糟糕,但 2.5X 似乎有点过分——即使对于 Microsoft bloat 来说也是如此。

差异是什么?四个 long 是复合键,这有关系吗?

【问题讨论】:

  • 有索引吗?一个 PK 不应该增加太多的大小(表聚集在 PK 上,除了表存储本身之外,维护 PK 索引的额外开销很少),但其他索引会增加很大比例,特别是对于这些类型字段,其中索引大小将是该字段实际数据占用空间的重要部分。尝试删除数据库副本上的所有索引,看看会得到什么。

标签: database ms-access ms-access-2007


【解决方案1】:

这是我的测试结果,全部使用 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。

我确实注意到的一件事是,我可以实现一个使文件变大的索引,然后删除索引并压缩,它会恢复到与以前完全相同的文件大小,所以你应该能够获取数据库的单个副本并尝试删除索引对文件大小的影响。

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2011-11-14
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2011-05-15
    • 2012-03-28
    • 2020-05-03
    • 2010-10-25
    相关资源
    最近更新 更多