我们知道 MS Access 数据库引擎被“限制”以允许最大文件大小为 2GB(或者可能在内部被限制为小于 4KB 数据页中的 2 个)。但这实际上意味着什么?
为了帮助我衡量这一点,你能告诉我可以插入 MS Access 数据库引擎表的最大行数吗?
为了满足表的定义,所有行都必须是唯一的,因此需要唯一的约束(例如PRIMARY KEY
、UNIQUE
、CHECK
、数据宏等)。
编辑:我意识到有一个理论上的限制,但我感兴趣的是实际(不一定可行),现实生活中的限制。
我们知道 MS Access 数据库引擎被“限制”以允许最大文件大小为 2GB(或者可能在内部被限制为小于 4KB 数据页中的 2 个)。但这实际上意味着什么?
为了帮助我衡量这一点,你能告诉我可以插入 MS Access 数据库引擎表的最大行数吗?
为了满足表的定义,所有行都必须是唯一的,因此需要唯一的约束(例如PRIMARY KEY
、UNIQUE
、CHECK
、数据宏等)。
编辑:我意识到有一个理论上的限制,但我感兴趣的是实际(不一定可行),现实生活中的限制。
一些评论:
Jet/ACE 文件是按数据页组织的,这意味着当您的记录边界与数据页不一致时,会有一定量的松弛空间。
行级锁定将大大减少可能记录的数量,因为它强制每个数据页一条记录。
在 Jet 4 中,数据页大小增加到 4KB(从 Jet 3.x 中的 2KB)。由于 Jet 4 是第一个支持 Unicode 的 Jet 版本,这意味着您可以存储 1GB 的双字节数据(即 1,000,000,000 个双字节字符),并且在打开 Unicode 压缩的情况下,可以存储 2GB 的数据。因此,记录数将受到您是否启用 Unicode 压缩的影响。
由于我们不知道 Jet/ACE 文件中有多少空间被标头和其他元数据占用,也不确切知道索引存储占用了多少空间,因此理论计算总是低于实际情况。
为了获得最有效的存储,您需要使用代码而不是 Access UI 创建数据库,因为 Access 创建了纯 Jet 不需要的某些属性。这并不是说其中有很多,因为设置为 Access 默认值的属性通常根本没有设置(该属性仅在您将其从默认值更改时创建 - 这可以通过循环浏览字段的properties 集合,即 Access 表设计器中为字段列出的许多属性在 properties 集合中不存在,因为它们尚未设置),但您可能希望将自己限制为 Jet 特定的数据类型(超链接字段例如,仅限访问)。
我只是浪费了一个小时来处理这个问题,使用 Rnd() 填充定义为字节类型的 4 个字段,在这四个字段上使用复合 PK,并且需要永远附加足够的记录才能达到 2GB 的任何重要部分。该文件有超过 200 万条记录,小于 80MB。在达到700K 700 万条记录并将文件压缩到 184MB后,我终于退出了。接近 2GB 所需的时间比我愿意投资的要多!
这是我的尝试:
我创建了一个没有键的单列 ( INTEGER
) 表:
CREATE TABLE a (a INTEGER NOT NULL);
从 1 开始按顺序插入整数。
当它插入 65,632,875 行时,我停止了它(在多个小时后任意)。文件大小为 1,029,772 KB。
我压缩了文件,将其略微减少到 1,029,704 KB。
我添加了一个PK:
ALTER TABLE a ADD CONSTRAINT p PRIMARY KEY (a);
这将文件大小增加到 1,467,708 KB。
这表明最大值在 8000 万左右。
正如其他人所说,它是您的架构和索引数量的组合。
一位朋友在一个接近 2 Gb 限制的 MDB 中拥有大约 100,000,000 个历史股票价格(每日收盘价)。
他使用 Microsoft 知识库文章中的一些代码将它们拉下来。我很惊讶他使用的任何服务器都没有在前 10 万条记录后切断他的连接。
他可以在一秒钟内查看任何记录。
自从我上次使用 Access 以来已经有好几年了,但与较小的文件相比,较大的数据库文件总是有更多的问题并且更容易损坏。
除非数据库文件仅由一个人访问或存储在强大的网络上,否则您可能会在达到 2GB 数据库大小限制之前发现这是一个问题。
我们不一定在这里谈论理论限制,我们谈论的是 2GB 最大文件大小和数据库模式的现实世界限制。
在确定您可以拥有多少行时,该模式与行数保持一致。
我们使用 Access MDB 存储 MS-SQL 数据的导出,以供我们的一些公司用户进行统计分析。在这些情况下,我们导出了我们的核心表结构,通常是四个具有 20 到 150 列的表,从每行 100 字节到每行 8000 字节不等。在这些情况下,我们会遇到几十万行数据是允许的 PER MDB,我们将发送它们。
所以,我只是认为在没有您的架构的情况下这个问题没有答案。
这一切都取决于。理论上使用具有 4 字节数据类型的单列。您可以存储 300 000 行。但是即使在您做任何事情之前,数据库中也可能存在很多开销。我读了一些你可以有 1.000.000 行的地方,但同样,这一切都取决于..
您还可以将数据库链接在一起。将自己限制为仅磁盘空间。
实用 = '在实践中有用' - 所以你会得到的最好的是轶事。其他一切都只是原型设计和测试结果。
我同意其他人的观点——确定“最大记录数量”完全取决于模式——# 表、# 字段、# 索引。
另一个轶事:我最近达到了 1.6GB 的文件大小,其中包含 2 个主要数据存储(表),分别为 36 个和 85 个字段,另外 3 个表中有一些子集副本。
谁在乎数据是否唯一——只有在上下文表明它是唯一的情况下才是重要的。数据就是数据就是数据,除非重复影响索引器的处理。
构成 1.6GB 的总行数为 1.72M。
在处理 4 个大型 Db2 表时,我不仅发现了限制,而且让我看起来非常糟糕,因为老板认为我可以将所有四个表(每个表都有超过 900,000 行)附加到一个大表中。现实生活中的结果是,无论我尝试了多少次表格(它正好有 34 列 - 30 个文本和 3 个整数)都会吐出一些神秘的消息“无法打开数据库无法识别的格式或文件可能已损坏”。底线是少于 1,500,000 条记录,仅略多于 1,252,000 条,有 34 行。